summaryrefslogtreecommitdiffstats
path: root/tests/tools.at
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/tools.at490
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