Browse Source

Added my own testsuite for the Midnight Commander. Unlike the existing
one, it does not need to have a clean working directory. Instead, it
fetches the source code from a CVS repository, autoconfigures it and
builds various versions of the Midnight Commander.

Roland Illig 20 years ago
parent
commit
2f08bc1c8f
1 changed files with 514 additions and 0 deletions
  1. 514 0
      maint/mc-test

+ 514 - 0
maint/mc-test

@@ -0,0 +1,514 @@
+#!/bin/sh
+
+# Midnight Commander Test Suite
+#
+# (c) 2005 Roland Illig <roland.illig@gmx.de>
+#
+# Licensed under the GPL 2.0
+
+set -efu
+
+### initialize environment ###
+
+LC_CTYPE="C"; export LC_ALL
+LC_COLLATE="C"; export LC_COLLATE
+LC_MONETARY="C"; export LC_MONETARY
+LC_NUMERIC="C"; export LC_NUMERIC
+LC_TIME="C"; export LC_TIME
+LC_MESSAGES="C"; export LC_MESSAGES
+LC_ALL="C"; export LC_ALL
+
+### set default configuration ###
+
+mc_nice_value="19"
+
+mc_basedir="/tmp/mc-current-build"
+mc_srcdir=""			# default: ${mc_basedir}/src
+mc_builddir=""			# default: ${mc_basedir}/build
+mc_prefixdir=""			# default: ${mc_basedir}/installed
+mc_logdir=""			# default: ${mc_basedir}/logs
+
+mc_cvs_rsh="ssh"
+mc_cvs_repository=":ext:anoncvs@cvs.gnu.org:/cvsroot/mc"
+mc_cvs_module="mc"
+mc_cvs_tag="HEAD"
+
+mc_configure_args_pre="--enable-maintainer-mode"
+mc_configure_args_post=""
+
+mc_make="make"
+mc_make_flags=""
+
+mc_cpp=""			# default: ${mc_cc} -E
+mc_cppflags=""
+
+mc_cc="cc"
+mc_cflags=""
+
+mc_ldflags=""
+
+do_clean_basedir=no
+do_download=auto
+do_autoconf=auto
+do_clean_workdir=no
+do_configure=auto
+do_make_clean=no
+do_make_all=yes
+do_make_install=yes
+
+### command line parsing ###
+
+usage() {
+	cat >&2 <<EOF
+usage: `basename $0` [options ...] [<testname ...>]
+
+	-config <file>		load the configuration from <file>
+	-basedir <dir>		set the base directory
+	-srcdir <dir>		select the directory where the source code is
+				read from or will be downloaded to from CVS
+
+	-[dont-]download	checkout or update from CVS (default: ${do_download})
+	-[dont-]autoconf	generate the configure script (default: ${do_autoconf})
+	-[dont-]cleanwork	recreate the build directory (default: ${do_clean_workdir})
+	-[dont-]configure	run configure (default: ${do_configure})
+	-[dont-]clean		make clean (default: ${do_make_clean})
+	-[dont-]build		make all (default: ${do_make_all})
+	-[dont-]install		make install (default: ${do_make_install})
+
+	-fast			only do what's necessary
+	-nice <n>		set the nice(1) value (default: ${mc_nice_value})
+	-quiet			disable most status messages (default: ${quiet:-"no"}${quiet+"yes"})
+EOF
+	exit 1
+}
+
+while test $# -ne 0; do
+	case "$1" in
+		-config)		shift; . "$1"; shift;;
+		-basedir)		shift; mc_basedir="$1"; shift;;
+		-cvs-repository)	shift; mc_cvs_repository="$1"; shift;;
+		-cvs-module)		shift; mc_cvs_module="$1"; shift;;
+		-srcdir)		shift; mc_srcdir="$1"; shift;;
+
+		-cleanup)		shift; do_clean_basedir=yes;;
+
+		-download)		shift; do_download=yes;;
+		-dont-download)		shift; do_download=no;;
+		-autoconf)		shift; do_autoconf=yes;;
+		-dont-autoconf)		shift; do_autoconf=no;;
+		-cleanwork)		shift; do_clean_workdir=yes;;
+		-dont-cleanwork)	shift; do_clean_workdir=no;;
+		-configure)		shift; do_configure=yes;;
+		-dont-configure)	shift; do_configure=no;;
+		-clean)			shift; do_make_clean=yes;;
+		-dont-clean)		shift; do_make_clean=no;;
+		-build)			shift; do_make_all=yes;;
+		-dont-build)		shift; do_make_all=no;;
+		-install)		shift; do_make_install=yes;;
+		-dont-install)		shift; do_make_install=no;;
+
+		-fast)			shift; do_clean_workdir=no
+					do_autoconf=no
+					do_configure=no
+					do_make_clean=no
+					do_make_all=yes;;
+		-nice)			shift; nice_value="$1"; shift;;
+		-quiet)			shift; quiet="yes";;
+
+		--) shift; break;;
+		-) shift; break;;
+		-*) usage;;
+		*) break;;
+	esac
+done
+
+
+### Initialization ###
+
+renice ${mc_nice_value} $$ 1>/dev/null 2>&1 || true
+
+### Tools ###
+
+configure_args_enable_all="--enable-largefile --enable-nls "\
+"--enable-netcode --enable-background --enable-charset "\
+"--with-mmap --with-included-gettext --with-x "\
+"--with-vfs --with-mcfs --with-samba --with-ext2undel "\
+"--with-gpm-mouse --with-subshell --with-edit"
+configure_args_disable_all="--disable-largefile --disable-nls "\
+"--disable-netcode --disable-background --disable-charset "\
+"--without-mmap --without-included-gettext --without-x "\
+"--without-vfs --without-mcfs --without-samba --without-ext2undel "\
+"--without-gpm-mouse --without-subshell --without-edit"
+
+errors=0
+warnings=0
+
+# feature tests
+if test x"`echo -n`" = x"-n"; then
+	echo_n="echo"
+	echo_cont="	" # a tab character
+else
+	echo_n="echo -n"
+	echo_cont=" "
+fi
+
+
+show_file() {
+	if test -f "$1"; then
+		echo "" 1>&2
+		sed -e '10s,.*,(more lines follow ...),' -e '10q' "$1" 1>&2
+		echo "" 1>&2
+	fi
+	return 0
+}
+
+phase_start() {
+	${echo_n} "[`date`] $1"
+	return 0
+}
+
+phase_ok() {
+	echo "${echo_cont}ok"
+	return 0
+}
+
+phase_warnings() {
+	echo "${echo_cont}WARNINGS"
+	warnings=`expr $warnings + 1`
+	if test $# -gt 0; then show_file "$1"; fi
+	return 0
+}
+
+phase_ok_or_warnings() {
+	fsize=`wc -c < "$1"`
+
+	{ test -n "${fsize}" && test ${fsize} -eq 0
+	} && phase_ok || phase_warnings "$1"
+	return 0
+}
+
+phase_failed() {
+	echo "${echo_cont}FAILED"
+	failed=yes
+	errors=`expr $errors + 1`
+	if test $# -gt 0; then show_file "$1"; fi
+	return 0
+}
+
+setup_preconf_env=\
+"out=\"\${mc_logdir}/\${test_phase}.out\";"\
+"err=\"\${mc_logdir}/\${test_phase}.err\";"
+
+preconf_download() {
+	test_phase="download"
+	eval "${setup_preconf_env}"
+
+	if test ${do_download} = no && test -d "${mc_srcdir}/CVS"; then
+		return 0
+	fi
+
+	mkdir -p "${mc_logdir}"
+
+	if test -d "${mc_srcdir}/CVS"; then
+		phase_start "updating CVS copy ..."
+		( cd "${mc_srcdir}" \
+		  && env CVS_RSH=${mc_cvs_rsh} cvs update -r "${mc_cvs_tag}" -dP
+		) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
+	else
+		phase_start "getting fresh CVS copy ..."
+		( mkdir -p "${mc_srcdir}" \
+		  && cd "${mc_srcdir}/.." \
+		  && env CVS_RSH=${mc_cvs_rsh} cvs -d "${mc_cvs_repository}" checkout -P -r "${mc_cvs_tag}" -d "`basename "${mc_srcdir}"`" "${mc_cvs_module}"
+		) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
+	fi
+}
+
+preconf_autoconf() {
+	test_phase="autoconf"
+	eval "${setup_preconf_env}"
+
+	if test ${do_autoconf} != yes && test -f "${mc_srcdir}/configure"; then
+		return 0
+	fi
+
+	mkdir -p "${mc_logdir}"
+
+	phase_start "creating ./configure script ..."
+	{ cd "${mc_srcdir}" \
+	  && echo "#!/bin/sh" > ./configure.mc \
+	  && chmod +x ./configure.mc \
+	  && ${SHELL-"/bin/sh"} ./autogen.sh
+	} 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
+}
+
+setup_testenv=\
+"test_srcdir=\"\${mc_srcdir}\";"\
+"test_workdir=\"\${mc_builddir}/\${testname}\";"\
+"test_prefix=\"\${mc_prefixdir}/\${testname}\";"\
+"test_logdir=\"\${mc_logdir}/\${testname}\";"\
+"out=\"\${test_logdir}/\${test_phase}.out\";"\
+"err=\"\${test_logdir}/\${test_phase}.err\";"
+
+confbuild_cleanwork() {
+	test_phase="cleanwork"
+	eval "${setup_testenv}"
+
+	if test ${do_clean_workdir} = no || test ! -d "${test_workdir}"; then
+		return 0
+	fi
+
+	mkdir -p "${test_logdir}"
+
+	phase_start "cleaning directory for ${testname} ..."
+	{ rm -rf "${test_workdir}"
+	} 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
+}
+
+confbuild_configure() {
+	test_phase="configure"
+	eval "${setup_testenv}"
+
+	if test ${do_configure} = no && test -f "${test_workdir}/Makefile"; then
+		return 0
+	fi
+
+	mkdir -p "${test_logdir}"
+
+	phase_start "configuring for ${testname} ..."
+	( set -e
+	  mkdir -p "${test_workdir}"
+	  cd "${test_workdir}"
+	  cmd="${test_srcdir}/configure"
+	  cmd="${cmd} --prefix=\"${test_prefix}\""
+	  cmd="${cmd} CPP=\"${mc_cpp}\""
+	  cmd="${cmd} CPPFLAGS=\"${mc_cppflags}\""
+	  cmd="${cmd} CC=\"${mc_cc}\""
+	  cmd="${cmd} CFLAGS=\"${mc_cflags}\""
+	  cmd="${cmd} LDFLAGS=\"${mc_ldflags}\""
+	  cmd="${cmd} ${mc_configure_args_pre}"
+	  cmd="${cmd} ${configure_args}"
+	  cmd="${cmd} ${mc_configure_args_post}"
+	  echo "running $cmd"
+	  eval "$cmd"
+	) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
+}
+
+confbuild_make() {
+	make_target="$1"
+	test_phase="make_${make_target}"
+	eval "${setup_testenv}"
+
+	if eval "test \${do_make_${make_target}} = no"; then
+		return 0
+	fi
+
+	mkdir -p "${test_logdir}"
+
+	phase_start "running \"make ${make_target}\" for ${testname} ..."
+	( cd "${test_workdir}" \
+	  && eval "${mc_make} ${mc_make_flags} ${make_target}"
+	) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
+}
+
+confbuild() {
+	failed=no
+
+	confbuild_cleanwork
+	if test ${failed} = yes; then return 0; fi
+
+	confbuild_configure
+	if test ${failed} = yes; then return 0; fi
+
+	confbuild_make "clean"
+	if test ${failed} = yes; then return 0; fi
+
+	confbuild_make "all"
+	if test ${failed} = yes; then return 0; fi
+
+	confbuild_make "install"
+	if test ${failed} = yes; then return 0; fi
+}
+
+
+test_plain() {
+	testname="plain" \
+	configure_args="" \
+	confbuild
+}
+
+test_charset() {
+	testname="charset" \
+	configure_args="--enable-charset" \
+	confbuild
+}
+
+test_no_charset() {
+	testname="no_charset" \
+	configure_args="--disable-charset" \
+	confbuild
+}
+
+test_X11() {
+	testname="X11" \
+	configure_args="--with-x" \
+	confbuild
+}
+
+test_no_X11() {
+	testname="no_X11" \
+	configure_args="--without-x" \
+	confbuild
+}
+
+test_vfs() {
+	testname="vfs" \
+	configure_args="--with-vfs" \
+	confbuild
+}
+
+test_no_vfs() {
+	testname="no_vfs" \
+	configure_args="--without-vfs" \
+	confbuild
+}
+
+test_mcfs() {
+	testname="mcfs" \
+	configure_args="--with-mcfs" \
+	confbuild
+}
+
+test_no_mcfs() {
+	testname="no_mcfs" \
+	configure_args="--without-mcfs" \
+	confbuild
+}
+
+test_samba() {
+	testname="samba" \
+	configure_args="--with-samba" \
+	confbuild
+}
+
+test_no_samba() {
+	testname="no_samba" \
+	configure_args="--without-samba" \
+	confbuild
+}
+
+test_ext2undel() {
+	testname="ext2undel" \
+	configure_args="--with-ext2undel" \
+	confbuild
+}
+
+test_no_ext2undel() {
+	testname="no_ext2undel" \
+	configure_args="--without-ext2undel" \
+	confbuild
+}
+
+test_slang() {
+	testname="slang" \
+	configure_args="--with-screen=slang" \
+	confbuild
+}
+
+test_mcslang() {
+	testname="mcslang" \
+	configure_args="--with-screen=mcslang" \
+	confbuild
+}
+
+test_ncurses() {
+	testname="ncurses" \
+	configure_args="--with-screen=ncurses" \
+	confbuild
+}
+
+test_maintainer() {
+	testname="maintainer" \
+	configure_args="--enable-maintainer-mode" \
+	confbuild
+}
+
+test_no_maintainer() {
+	testname="no_maintainer" \
+	configure_args="--disable-maintainer-mode" \
+	confbuild
+}
+
+test_i18n() {
+	testname="i18n" \
+	configure_args="--enable-nls" \
+	confbuild
+}
+
+test_no_i18n() {
+	testname="no_i18n" \
+	configure_args="--disable-nls" \
+	confbuild
+}
+
+test_no_features() {
+	testname="no_features" \
+	configure_args="${configure_args_disable_all}"
+	confbuild
+}
+
+test_all_features() {
+	testname="all_features" \
+	configure_args="${configure_args_enable_all}" \
+	confbuild
+}
+
+test_all_warnings() {
+	testname="all_warnings" \
+	configure_args="${configure_args_enable_all} --enable-gcc-warnings" \
+	confbuild
+}
+
+run_tests() {
+	failed=no
+
+	preconf_download
+	if test ${failed} = yes; then return 0; fi
+
+	preconf_autoconf
+	if test ${failed} = yes; then return 0; fi
+
+	for i in "$@"; do
+		if type test_"${i}" 2>/dev/null \
+		   | grep "function" 1>/dev/null 2>&1; then
+			eval "test_${i}"
+		else
+			echo "[`date`] test \"$i\" not found." 1>&2
+			errors=`expr $errors + 1`
+		fi
+	done
+}
+
+if test -z "${mc_srcdir}";    then mc_srcdir="${mc_basedir}/src";          fi
+if test -z "${mc_prefixdir}"; then mc_prefixdir="${mc_basedir}/installed"; fi
+if test -z "${mc_builddir}";  then mc_builddir="${mc_basedir}/build";      fi
+if test -z "${mc_logdir}";    then mc_logdir="${mc_basedir}/logs";         fi
+if test -z "${mc_cpp}";       then mc_cpp="${mc_cc} -E";                   fi
+
+if test ${do_clean_basedir} = yes; then
+	phase_start "cleaning up everything ..."
+	{ rm -rf "${mc_basedir}"
+	} && phase_ok || phase_failed
+else
+	if test $# -gt 0; then
+		run_tests "$@"
+	else
+		run_tests `sed -n -e 's,^test_\([a-z0-9_]*\)() .*{,\1,p' $0`
+	fi
+fi
+
+if test ${errors} -ne 0 || test ${warnings} -ne 0; then
+	echo "[`date`] finished with ${errors} errors and ${warnings} warnings."
+else
+	echo "[`date`] finished successfully."
+fi
+exit ${errors}