| #! /bin/sh | |
| # Copyright (C) 2011-2026 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 <https://www.gnu.org/licenses/>. | |
| # Parallel test harness: check that $(TESTS) can lazily depend on | |
| # (or even be) $(EXTRA_PROGRAMS). | |
| required='cc native' | |
| . test-init.sh | |
| cat >> configure.ac << 'END' | |
| AC_PROG_CC | |
| AC_OUTPUT | |
| END | |
| # Will be extended later. | |
| cat > Makefile.am << 'END' | |
| TEST_EXTENSIONS = .bin .test | |
| EXTRA_PROGRAMS = | |
| TESTS = | |
| END | |
| # | |
| # Now try various kinds of test dependencies ... | |
| # | |
| # 1. A program that is also a test, and whose source files | |
| # already exist. | |
| cat >> Makefile.am <<'END' | |
| EXTRA_PROGRAMS += foo.bin | |
| TESTS += foo.bin | |
| foo_bin_SOURCES = foo.c | |
| END | |
| cat > foo.c <<'END' | |
| #include <stdio.h> | |
| int main (void) | |
| { | |
| printf ("foofoofoo\n"); | |
| return 0; | |
| } | |
| END | |
| # 2. A program that is also a test, and whose source files | |
| # are buildable by make. | |
| cat >> Makefile.am <<'END' | |
| EXTRA_PROGRAMS += bar.bin | |
| TESTS += bar.bin | |
| bar_bin_SOURCES = bar.c | |
| bar.c: foo.c | |
| sed -e 's/foofoofoo/barbarbar/' foo.c > $@ | |
| END | |
| # 3. A test script that already exists, whose execution depends | |
| # on a program whose source files already exist and which is | |
| # not itself a test. | |
| cat >> Makefile.am <<'END' | |
| EXTRA_PROGRAMS += y | |
| TESTS += baz.test | |
| baz.log: y$(EXEEXT) | |
| END | |
| cat > baz.test <<'END' | |
| #!/bin/sh | |
| $srcdir/y "$@" | sed 's/.*/&ep&ep&ep/' | |
| END | |
| chmod a+x baz.test | |
| cat > y.c <<'END' | |
| #include <stdio.h> | |
| int main (void) | |
| { | |
| printf ("y\n"); | |
| return 0; | |
| } | |
| END | |
| # 4. A program that is also a test, but whose source files | |
| # do not exit and are not buildable by make. | |
| cat >> Makefile.am <<'END' | |
| EXTRA_PROGRAMS += none.bin | |
| TESTS += none.bin | |
| none_bin_SOURCES = none.c | |
| END | |
| # | |
| # Setup done, go with the tests. | |
| # | |
| $ACLOCAL | |
| $AUTOCONF | |
| $AUTOMAKE -a | |
| ./configure | |
| # What we check now: | |
| # 1. even if we cannot build the 'none.bin' program, all the other | |
| # test programs should be built, and all the other tests should | |
| # be run; | |
| # 2. still, since we cannot create the 'none.log' file, the | |
| # 'test-suite.log' file shouldn't be created (as it depends | |
| # on *all* the test logs). | |
| run_make -E -O -e IGNORE -- -k check | |
| ls -l | |
| if using_gmake; then | |
| test $am_make_rc -gt 0 || exit 1 | |
| else | |
| # Don't trust exit status of "make -k" for non-GNU make. | |
| $MAKE check && exit 1 | |
| : For shells with busted 'set -e'. | |
| fi | |
| # Files that should have been created, with the expected content. | |
| cat bar.c | |
| grep foofoofoo foo.log | |
| grep barbarbar bar.log | |
| grep yepyepyep baz.log | |
| # Files that shouldn't have been created. | |
| test ! -e none.log | |
| test ! -e test-suite.log | |
| # Expected testsuite progress output. | |
| grep '^PASS: baz\.test$' stdout | |
| # Don't anchor the end of the next two patterns, to allow for non-empty | |
| # $(EXEEXT). | |
| grep '^PASS: foo\.bin' stdout | |
| grep '^PASS: bar\.bin' stdout | |
| # Expected error messages from make. Some make implementations (e.g., | |
| # FreeBSD make) seem to print the error on stdout instead, so check for | |
| # it there as well. | |
| $EGREP 'none\.(bin|o|c)' stderr stdout | |
| # What we check now: | |
| # 1. if we make the last EXTRA_PROGRAM buildable, the failed tests | |
| # pass; | |
| # 2. on a lazy re-run, the passed tests are not re-run, and | |
| # 3. their log files are not updated or touched. | |
| : > stamp | |
| $sleep | |
| echo 'int main (void) { return 0; }' > none.c | |
| run_make -O -e IGNORE check RECHECK_LOGS= | |
| ls -l # For debugging. | |
| test $am_make_rc -eq 0 || exit 1 | |
| # For debugging. | |
| stat stamp foo.log bar.log baz.log || : | |
| # Files that shouldn't have been updated or otherwise touched. | |
| is_newest stamp foo.log bar.log baz.log | |
| # Files that should have been created now. | |
| test -f none.log | |
| test -f test-suite.log | |
| # Tests that shouldn't have been re-run. | |
| $EGREP '(foo|bar)\.bin|baz\.test$' stdout && exit 1 | |
| # Tests that should have been run. Again, we don't anchor the end | |
| # of the next pattern, to allow for non-empty $(EXEEXT). | |
| grep '^PASS: none\.bin' stdout | |
| : |