#! /bin/sh # Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Check parallel-tests features: # - concurrent parallel execution # FIXME: we should factor out (into am-test-lib.sh?) the code to determine # how to run make in parallel mode ... . test-init.sh case $MAKE in *\ -j*) skip_ "\$MAKE contains '-j'";; esac if using_gmake; then j=-j else unindent > Makefile < \$@ END for j in "-j" "-j " NONE; do if test x"$j" = xNONE; then skip_ "can't run make in parallel mode" fi run_make -M -- ${j}2 all || continue $EGREP -i "(warning|error):|-j[\"\'\` ]" output && continue break done rm -f one output Makefile fi cat >> configure.ac << 'END' AC_OUTPUT END cat > Makefile.am << 'END' TESTS = END cat > x <<'END' #! /bin/sh echo "this is $0" # Creative quoting below to please maintainer-check. sleep '1' exit 0 END chmod a+x ./x mkdir sub for i in 1 2 3; do echo "TESTS += foo$i.test" >> Makefile.am cp x foo$i.test echo "TESTS += zap$i" >> Makefile.am cp x zap$i echo "TESTS += sub/bar$i.test" >> Makefile.am cp x sub/bar$i.test echo "TESTS += sub/mu$i" >> Makefile.am cp x sub/mu$i done $ACLOCAL $AUTOCONF $AUTOMAKE -a for build in serial parallel; do mkdir $build cd $build ../configure $MAKE cd .. done cd serial # Do *not* use "make -j1" here; apparently, some make implementations # (e.g., AIX 7.1) interpret it as a synonym of "make -j" :-( $MAKE check & cd .. cd parallel $sleep run_make -O -- ${j}4 check cd .. # Ensure the tests are really being run in parallel mode: if this is # the case, the serial run of the dummy testsuite started above should # still be ongoing when the parallel one has terminated. kill -0 $! cat parallel/stdout test $(grep -c '^PASS:' parallel/stdout) -eq 12 # Wait long enough so that there are no open files any more when the # post-test cleanup runs. But exit after we've waited for two minutes # or more, to avoid testsuite hangs in unusual situations (this has # already happened). i=1 while test ! -f serial/test-suite.log && test $i -le 120; do i=$(($i + 1)) sleep '1' # Extra quoting to please maintainer-check. done $sleep :