diff options
Diffstat (limited to '')
-rw-r--r-- | tests/tools.at | 490 |
1 files changed, 490 insertions, 0 deletions
diff --git a/tests/tools.at b/tests/tools.at new file mode 100644 index 0000000..7c953b2 --- /dev/null +++ b/tests/tools.at @@ -0,0 +1,490 @@ +# -*- autoconf -*- + +AT_BANNER([Executables (autoheader, autoupdate...).]) + +## -------------------------------------------------------- ## +## Check that the shell scripts are syntactically correct. ## +## -------------------------------------------------------- ## + +# We use `/bin/sh -n script' to check that there are no syntax errors +# in the scripts. Although incredible, there are /bin/sh that go into +# endless loops with `-n', e.g., SunOS's: +# +# $ uname -a +# SunOS ondine 4.1.3 2 sun4m unknown +# $ cat endless.sh +# while false +# do +# : +# done +# exit 0 +# $ time sh endless.sh +# sh endless.sh 0,02s user 0,03s system 78% cpu 0,064 total +# $ time sh -nx endless.sh +# ^Csh -nx endless.sh 3,67s user 0,03s system 63% cpu 5,868 total +# +# So before using `/bin/sh -n' to check our scripts, we first check +# that `/bin/sh -n' is not broken to death. + +AT_SETUP([Syntax of the scripts]) + +# A script that never returns. We don't care that it never returns, +# broken /bin/sh loop equally with `false', but it makes it easier to +# test the robusteness in a good environment: just remove the `-n'. +AT_DATA(endless.sh, +[[while : +do + : +done +]]) + +# A script in charge of testing `/bin/sh -n'. +AT_DATA(syntax.sh, +[[(/bin/sh -n endless.sh) & +sleep 2 +if kill $! >/dev/null 2>&1; then + # We managed to kill the child, which means that we probably + # can't trust `/bin/sh -n', hence the test failed. + exit 77 +fi +]]) + +# If we can't trust sh, just skip. +AT_CHECK([/bin/sh ./syntax.sh]) + +# Specify the path to the tool, some shells don't honor PATH when +# running `sh PROG'. + +AT_CHECK([/bin/sh -n ../autoconf], 0) +AT_CHECK([/bin/sh -n ../autoreconf], 0) +AT_CHECK([/bin/sh -n ../ifnames], 0) + +# These are not built, they are in the src tree. +AT_CHECK([/bin/sh -n $top_srcdir/config/install-sh], 0) +AT_CHECK([/bin/sh -n $top_srcdir/config/missing], 0) + +AT_CLEANUP + + + + +## ----------------- ## +## AWK portability. ## +## ----------------- ## + +AT_SETUP([AWK portability]) + +AT_DATA([configure.ac], +[]) + +# Skip if we don't have GNU Awk. +AT_CHECK([gawk --version || exit 77], 0, ignore, ignore) + +# Generation of the script. +AT_CHECK([AWK='gawk --posix' autoconf --autoconf-dir .. -l $at_srcdir], 0, + [], []) +# Tracing. +AT_CHECK([AWK='gawk --posix' autoconf --autoconf-dir .. -l $at_srcdir -t AC_INIT], 0, + ignore, []) +# Syntax correctness of ifnames. +AT_CHECK([AWK='gawk --posix' ifnames /dev/null], 0, + [], []) + +AT_CLEANUP(configure) + + + + + + +## ------------------ ## +## autoconf --trace. ## +## ------------------ ## + + +# autoconf --trace: user macros +# ----------------------------- +AT_SETUP([autoconf --trace: user macros]) + +AT_DATA(configure.ac, +[[m4_define([active], [ACTIVE]) +m4_define([TRACE1], [TRACE2(m4_shift($@))]) +m4_define([TRACE2], [[$2], $1]) +TRACE1(foo, bar, baz) +TRACE1(foo, TRACE1(bar, baz)) +TRACE1(foo, active, baz) +TRACE1(foo, [active], TRACE1(active, [active])) +]]) + +# Several --traces. +AT_CHECK([autoconf --autoconf-dir .. -l $at_srcdir -t TRACE1 -t TRACE2], 0, +[[configure.ac:4:TRACE1:foo:bar:baz +configure.ac:4:TRACE2:bar:baz +configure.ac:5:TRACE1:bar:baz +configure.ac:5:TRACE2:baz +configure.ac:5:TRACE1:foo::baz +configure.ac:5:TRACE2::baz +configure.ac:6:TRACE1:foo:ACTIVE:baz +configure.ac:6:TRACE2:ACTIVE:baz +configure.ac:7:TRACE1:ACTIVE:active +configure.ac:7:TRACE2:active +configure.ac:7:TRACE1:foo:active::ACTIVE +configure.ac:7:TRACE2:active::ACTIVE +]]) + +# Several line requests. +AT_CHECK([[autoconf --autoconf-dir .. -l $at_srcdir -t TRACE1:' +[$1], [$2], [$3].']], 0, +[[ +[foo], [bar], [baz]. + +[bar], [baz], []. + +[foo], [], [baz]. + +[foo], [ACTIVE], [baz]. + +[ACTIVE], [active], []. + +[foo], [active], []. +]]) + +# ${sep}@. +AT_CHECK([autoconf --autoconf-dir .. -l $at_srcdir -t TRACE2:'${)===(}@'], 0, +[[[bar])===([baz] +[baz] +[])===([baz] +[ACTIVE])===([baz] +[active] +[active])===([])===([ACTIVE] +]]) + +AT_CLEANUP + + +# autoconf --trace: builtins +# -------------------------- +AT_SETUP([autoconf --trace: builtins]) + +AT_DATA(configure.ac, +[[define([active], [ACTIVE]) +]]) + +AT_CHECK([[autoconf --autoconf-dir .. -l $at_srcdir -t define | + sed -n '$p']], + 0, +[[configure.ac:1:define:active:ACTIVE +]]) + +# FIXME: Without `$1' the following test dies. Groumphf, once again to +# dive into obscure feature interaction... +# Note that using `-i' means we need the *.m4 files, not the *.m4f files, +# hence we need srcdir, not builddir. +AT_CHECK([[autoconf --autoconf-dir $top_srcdir -l $at_srcdir -t define:'$1' -i| + sed -n '$p']], + 0, +[[active +]]) + +AT_CLEANUP + + + + +## ---------------------------- ## +## autoconf: forbidden tokens. ## +## ---------------------------- ## + +# autoconf: forbidden tokens, basic +# --------------------------------- +AT_SETUP([autoconf: forbidden tokens, basic]) + +AT_DATA([configure.ac], +[[AC_PLAIN_SCRIPT()dnl +AC_FOO +_AC_BAR +m4_foo +_m4_bar +BAC_FOO +B_AC_FOO +AS_FOO +_AS_BAR +]]) + +AT_CHECK([autoconf --autoconf-dir .. -l $at_srcdir], 1, [], [stderr]) +# The output of autoconf is not deterministic here because it +# uses `for (ind in array)'. So be sure to have a unique representation. +AT_CHECK([sort stderr], 0, +[[configure.ac:2: error: possibly undefined macro: AC_FOO +configure.ac:3: error: possibly undefined macro: _AC_BAR +configure.ac:4: error: possibly undefined macro: m4_foo +configure.ac:7: error: possibly undefined macro: B_AC_FOO +configure.ac:8: error: possibly undefined macro: AS_FOO +configure.ac:9: error: possibly undefined macro: _AS_BAR +]]) + +AT_CLEANUP(configure) + + +# autoconf: forbidden tokens, exceptions +# -------------------------------------- +AT_SETUP([autoconf: forbidden tokens, exceptions]) + +AT_DATA([configure.ac], +[[AC_PLAIN_SCRIPT()dnl + +# This is allowed in spite of the name. +# It is on purpose that we check the case where there are several +# tokens on the same line. +m4_pattern_allow([^AC_ALLOWED$]) +NOT_AC_ALLOWED AC_ALLOWED AC_ALLOWED_NOT + +# Test forbidding. +m4_pattern_forbid([^FORBIDDEN$]) +NOT_FORBIDDEN FORBIDDEN FORBIDDEN_NOT + +# Test Autoconf's patterns. +AC_THIS_IS_INVALID and _AC_THIS_IS_INVALID_TOO +BUT_AZ_THIS_IS_NOT ALTHOUGH_AC_THIS_IS +# This is legal, although there is `AC_DEFINE' in there. +BAC_DEFINE +# AC_THIS_IS_A_COMMENT so just shut up. +It would be very bad if Autoconf forgot to expand [AC_]OUTPUT! +]]) + +AT_CHECK([autoconf --autoconf-dir .. -l $at_srcdir], 1, [], [stderr]) +# The output of autoconf is not deterministic here because it +# uses `for (ind in array)'. So be sure to have a unique representation. +AT_CHECK([sort stderr], 0, +[[configure.ac:10: error: possibly undefined macro: FORBIDDEN +configure.ac:14: error: possibly undefined macro: AC_THIS_IS_INVALID +configure.ac:14: error: possibly undefined macro: _AC_THIS_IS_INVALID_TOO +configure.ac:15: error: possibly undefined macro: ALTHOUGH_AC_THIS_IS +configure.ac:7: error: possibly undefined macro: AC_ALLOWED_NOT +configure.ac:7: error: possibly undefined macro: NOT_AC_ALLOWED +configure:18: error: possibly undefined macro: AC_OUTPUT +]]) + +AT_CLEANUP(configure err) + + + + + +## --------- ## +## ifnames. ## +## --------- ## + +AT_SETUP([ifnames]) + +AT_DATA([iftest1.c], +[[#ifdef DEF1 +#ifndef DEF2 +#if !defined(DEF3) && defined(DEF4) /* but not defined(DEF5) */ + # if SPACES + # if TABS +/* #if C_COMMENTS */ +// #if CXX_COMMENTS +#if LINE1 = \ +LINE2 +#if (VAL1*VAL2)==VAL3+VAL4 /* Not VAL5 !!! */ +]]) + +AT_DATA([iftest2.c], +[[#ifdef IFTEST2 +#if VAL1 +]]) + +AT_CHECK([ifnames iftest1.c iftest2.c], 0, +[DEF1 iftest1.c +DEF2 iftest1.c +DEF3 iftest1.c +DEF4 iftest1.c +IFTEST2 iftest2.c +LINE1 iftest1.c +LINE2 iftest1.c +SPACES iftest1.c +TABS iftest1.c +VAL1 iftest1.c iftest2.c +VAL2 iftest1.c +VAL3 iftest1.c +VAL4 iftest1.c +], []) + +AT_CLEANUP + + + +## ------------ ## +## autoheader. ## +## ------------ ## + +# autoheader is intensively used in its modern form through this +# test suite. But we also have to check that acconfig.h still works. +# autoheader uses autoconf --trace, so traces first. + +AT_SETUP([autoheader]) + +AT_DATA(acconfig.h, +[[/* Define this to whatever you want. */ +#undef this +]]) + + +# 1. Check that `acconfig.h' is still honored. +AT_DATA(configure.ac, +[[AC_INIT +AC_CONFIG_HEADERS(config.h) +AC_DEFINE(this, "whatever you want.") +]]) + +AT_CHECK([autoheader --autoconf-dir .. -<configure.ac], 0, +[[/* config.h.in. Generated automatically from - by autoheader. */ +/* Define this to whatever you want. */ +#undef this +]], ignore) + + +# 2. Check that missing templates are a fatal error. +AT_DATA(configure.ac, +[[AC_INIT +AC_CONFIG_HEADERS(config.h) +AC_DEFINE(that, "whatever you want.") +]]) + +AT_CHECK([autoheader --autoconf-dir .. -<configure.ac], 1, [], +[autoheader: No template for symbol `that' +]) + + +# 3. Check TOP and BOTTOM. +AT_DATA(acconfig.h, +[[/* Top from acconfig.h. */ +@TOP@ +/* Middle from acconfig.h. */ +@BOTTOM@ +/* Bottom from acconfig.h. */ +]]) + +AT_DATA(configure.ac, +[[AC_INIT +AC_CONFIG_HEADERS(config.h) +AH_TOP([Top1 from configure.ac.]) +AH_TOP([Top2 from configure.ac.]) +AH_VERBATIM([Middle], [Middle from configure.ac.]) +AH_BOTTOM([Bottom1 from configure.ac.]) +AH_BOTTOM([Bottom2 from configure.ac.]) +]]) + + +# Yes, that's right: the `middle' part of `acconfig.h' is still before +# the AH_TOP part. But so what, you're not supposed to use the two +# together. +AT_CHECK([autoheader --autoconf-dir .. -<configure.ac], 0, +[[/* config.h.in. Generated automatically from - by autoheader. */ +/* Top from acconfig.h. */ + +/* Middle from acconfig.h. */ + +Top1 from configure.ac. + +Top2 from configure.ac. + +Middle from configure.ac. + +Bottom1 from configure.ac. + +Bottom2 from configure.ac. +/* Bottom from acconfig.h. */ +]], []) + + +AT_CLEANUP + + + + +## ------------ ## +## autoupdate. ## +## ------------ ## + +# Check that AC_CANONICAL_SYSTEM and AC_OUTPUT are properly updated. +AT_SETUP([autoupdate]) + +AT_DATA(configure.ac, +[[AC_INIT(Test, 1.0) +AC_CANONICAL_SYSTEM +dnl The doc says 27 is a valid fubar. +fubar=27 +AC_OUTPUT(Makefile, echo $fubar, fubar=$fubar) +]]) + +AT_DATA([expout], +[[AC_INIT([Test],[1.0]) +AC_CANONICAL_TARGET([]) +dnl The doc says 27 is a valid fubar. +fubar=27 +AC_OUTPUT(Makefile, echo $fubar, fubar=$fubar) +]]) + +# Checking `autoupdate'. +AT_CHECK_AUTOUPDATE +AT_CHECK([cat configure.ac], 0, [expout]) +# Checking that `autoupdate' is idempotent +AT_CHECK([autoupdate --autoconf-dir $top_srcdir], 0, [], + [autoupdate: `configure.ac' is unchanged +]) +AT_CHECK([cat configure.ac], 0, [expout]) + +AT_CLEANUP(configure.ac~) + + +# autoupdating AC_LINK_FILES +# -------------------------- +AT_SETUP([autoupdating AC_LINK_FILES]) + +AT_DATA(configure.ac, +[[AC_INIT +AC_LINK_FILES(dst1 dst2, src1 src2) +AC_OUTPUT +]]) + +AT_DATA(dst1, dst1 +) +AT_DATA(dst2, dst2 +) + +# Checking `autoupdate'. +AT_CHECK_AUTOUPDATE +AT_CHECK_AUTOCONF +AT_CHECK_CONFIGURE +AT_CHECK([cat src1], 0, [dst1 +]) +AT_CHECK([cat src2], 0, [dst2 +]) + +AT_CLEANUP(src1 src2 configure.ac~) + + +# autoupdating AC_PREREQ +# ---------------------- +AT_SETUP([autoupdating AC_PREREQ]) + +cat >expout <<EOF +AC_PREREQ($at_version) +EOF + +AT_CHECK([autoupdate --version || exit 77], ignore, ignore, ignore) +AT_CHECK([echo "AC_PREREQ(1.0)" | + autoupdate --autoconf-dir $top_srcdir -], + 0, [expout], []) + +AT_CHECK([echo "AC_PREREQ($at_version)" | + autoupdate --autoconf-dir $top_srcdir -], + 0, [expout], []) + +AT_CHECK([echo "AC_PREREQ(999.99)" | + autoupdate --autoconf-dir $top_srcdir -], + 1, [], [ignore]) + +AT_CLEANUP |