source: trunk/essentials/sys-devel/autoconf/tests/autotest.at@ 3310

Last change on this file since 3310 was 3092, checked in by bird, 19 years ago

autoconf 2.61

File size: 15.3 KB
Line 
1# -*- Autotest -*-
2
3AT_BANNER([Autotest.])
4
5# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
6#
7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2, or (at your option)
10# any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20# 02110-1301, USA.
21
22# AT_CHECK_AT(TITLE, SUITE-CODE, [XFAIL-CONDITION], [STATUS = 0],
23# [STDOUT := ignore], STDERR, [POST-TEST-CODE])
24# ---------------------------------------------------------------
25# Create a new test named TITLE that runs a minimal Autotest test suite,
26# SUITE-CODE. Call AT_XFAIL_IF with XFAIL-CONDITION. STATUS and STDERR pass
27# directly to the AT_CHECK that call the minimal test suite. STDOUT is not
28# used, but it is reserved for future use. Run POST-TEST-CODE
29# at the top level after the micro-suite has been run.
30m4_define([AT_CHECK_AT],
31[
32AT_SETUP([$1])
33AT_KEYWORDS([autotest])
34AT_CAPTURE_FILE([micro-suite.log])
35AT_XFAIL_IF([$3])
36
37AT_DATA([package.m4],[[
38m4_define([AT_PACKAGE_NAME], [GNU Nonsense])
39m4_define([AT_PACKAGE_TARNAME], [nonsense])
40m4_define([AT_PACKAGE_VERSION], [1.0])
41m4_define([AT_PACKAGE_STRING], [GNU Nonsense 1.0])
42m4_define([AT_PACKAGE_BUGREPORT], [bug-autoconf@gnu.org])
43]])
44
45AT_DATA([mysuite.at], [$2])
46
47# Do not use `testsuite' as the name of the small test suite, or the
48# log file it generates will overwrite the log that the Autoconf test
49# suite produces for this test case.
50AT_CHECK_AUTOM4TE([--language=autotest -o micro-suite mysuite.at])
51AT_CHECK([$CONFIG_SHELL ./micro-suite], m4_default([$4], 0), [ignore], [$6])
52AT_CHECK([$CONFIG_SHELL ./micro-suite -v -x], m4_default([$4], 0), [ignore], [$6])
53$7
54AT_CLEANUP
55])# AT_CHECK_AT
56
57# AT_CHECK_AT_TEST(TITLE, SUITE-SNIPPET, ...)
58# -----------------------------------------------------------------------
59# Wrapper for AT_CHECK_AT that surrounds SUITE-SNIPPET with a boilerplate
60# AT_INIT, AT_SETUP, and AT_CLEANUP and passes other arguments verbatim.
61m4_define([AT_CHECK_AT_TEST],
62[AT_CHECK_AT([$1],
63[[
64AT_INIT([artificial test suite])
65AT_SETUP([my only test])
66$2
67AT_CLEANUP
68]], m4_shiftn(2, $@))])
69
70# Here documents for these tests contain forbidden macros.
71m4_pattern_allow([^AT_])
72
73# AT_NO_CMDSUBST
74# --------------
75m4_define([AT_NO_CMDSUBST],
76[if (eval 'foo=$(echo bar) && test "$foo" = bar') >/dev/null 2>&1; then false; else :; fi])
77
78
79## ------------------ ##
80## Empty test suite. ##
81## ------------------ ##
82
83# This is not a sensible thing to do, but the user should not get an unhelpful
84# error message.
85AT_CHECK_AT([Empty test suite],
86[[AT_INIT([empty test suite])
87]])
88
89# Next level of emptiness.
90AT_CHECK_AT_TEST([Empty test], [])
91
92# And finally, an empty check should not cause a syntax error.
93AT_CHECK_AT_TEST([Empty check], [AT_CHECK])
94
95## ----------------------------------------------------- ##
96## Newlines and command substitutions in test commands. ##
97## ----------------------------------------------------- ##
98
99AT_CHECK_AT_TEST([Truth],
100 [AT_CHECK([:], 0, [], [])])
101
102AT_CHECK_AT_TEST([Fallacy],
103 [AT_CHECK([false], ignore, [], [])])
104
105AT_CHECK_AT_TEST([Literal multiline command],
106 [AT_CHECK([echo Auto'
107'conf], 0, [Auto
108conf
109], [])])
110
111AT_CHECK_AT_TEST([Multiline parameter expansion],
112 [FOO='one
113two'
114 AT_CHECK([echo "$FOO"], 0, [one
115two
116], [])])
117
118AT_CHECK_AT_TEST([Backquote command substition],
119 [AT_CHECK([echo `echo hi`], 0, [hi
120], [])])
121
122
123AT_CHECK_AT_TEST([Multiline backquote command substition],
124 [AT_DATA([myfile],[foo
125bar
126])
127 AT_CHECK([echo "`cat myfile`"], 0, [foo
128bar
129], [])])
130
131AT_CHECK_AT_TEST([Parenthetical command substition],
132 [AT_CHECK([echo $(echo hi)], 0, [hi
133], [])],
134 [AT_NO_CMDSUBST])
135
136AT_CHECK_AT_TEST([Multiline parenthetical command substition],
137 [AT_DATA([myfile],[foo
138bar
139])
140 AT_CHECK([echo "$(cat myfile)"], 0, [foo
141bar
142], [])],
143 [AT_NO_CMDSUBST])
144
145
146## ------------------------- ##
147## ${...} in test commands. ##
148## ------------------------- ##
149
150# If this invalid parameter expansion capsizes the test suite, the entire
151# AT_SETUP ... AT_CLEANUP subshell will exit, and the commands it runs will
152# appear to have succeeded. Therefore, we verify a failing test case.
153
154AT_CHECK_AT_TEST([Invalid brace-enclosed parameter expansion],
155 [AT_CHECK([echo '${=invalid}'], 0, [wrong])], [false], 1, ignore, ignore)
156
157
158## ---------------------------- ##
159## M4 macros in test commands. ##
160## ---------------------------- ##
161
162# The last paragaph in the comment above _AT_DECIDE_TRACEABLE illustrates why
163# this test fails (except with Korn shell-style quoting $'foo\nbar').
164AT_CHECK_AT_TEST([Multiline command from M4 expansion],
165 [m4_define([GNU], ['foo
166bar'])
167 AT_CHECK([echo GNU], 0, [foo
168bar
169], [])], [case `( set -x; echo 'foo
170bar') 2>&1` in *\$\'foo\\nbar\'*) false;; *) :;; esac])
171
172AT_CHECK_AT_TEST([Double-M4-quoted command],
173 [m4_define([GNU], ['foo
174bar'])
175 AT_CHECK([[echo GNU]], 0, [[GNU
176]], [])])
177
178
179## -------------------------------------- ##
180## Backslash-<newline> in test commands. ##
181## -------------------------------------- ##
182
183AT_CHECK_AT_TEST([BS-newline in command],
184 [AT_CHECK([echo Auto"\
185"conf], 0, [Autoconf
186], [])])
187
188AT_CHECK_AT_TEST([^BS-newline in command],
189 [AT_CHECK([\
190echo GNU], 0, [GNU
191], [])])
192
193AT_CHECK_AT_TEST([BSx641-newline in command],
194 [AT_CHECK([echo Auto"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
195"conf], 0, [Auto\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\conf
196], [])])
197
198AT_CHECK_AT_TEST([BS-BS-newline in command],
199 [AT_CHECK([echo Auto"\\
200"conf], 0, [Auto\
201conf
202], [])])
203
204# A `^BS-BS-newline in command' test will run a command named `\'. No, thanks.
205
206AT_CHECK_AT_TEST([BSx640-newline in command],
207 [AT_CHECK([echo Auto"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
208"conf], 0, [Auto\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
209conf
210], [])])
211
212# This command has both escaped and unescaped newlines.
213AT_CHECK_AT_TEST([Newline-CODE-BS-newline in command],
214 [AT_CHECK([echo Auto'
215'co\
216nf], 0, [Auto
217conf
218], [])])
219
220AT_CHECK_AT_TEST([Single-quote-BS-newline in command],
221 [AT_CHECK([echo Auto'\
222'conf], 0, [Auto\
223conf
224], [])])
225
226AT_CHECK_AT_TEST([Single-quote-newline-BS-newline in command],
227 [AT_CHECK([echo Auto'
228\
229'conf], 0, [Auto
230\
231conf
232], [])])
233
234
235## ------------------------------- ##
236## Funny characters in test names. ##
237## ------------------------------- ##
238
239# AT_CHECK_AT_TITLE(TITLE, TITLE-TO-TEST, EXPANDED-TITLE-TO-TEST
240# [XFAIL-CONDITION])
241# ---------------------------------------------------------------
242# Create a new test named TITLE that runs an Autotest test suite
243# comprised of a trivial test named TITLE-TO-TEST, which expands
244# to EXPANDED-TITLE-TO-TEST. XFAIL-CONDITION passes verbatim to
245# AT_CHECK_AT.
246m4_define([AT_CHECK_AT_TITLE],
247[AT_CHECK_AT([$1],
248[[
249m4@&t@_define([macro_name], [[macro_expanded]])
250m4@&t@_define([macro_expanded], [[macro_overexpanded]])
251m4@&t@_define([macro_backquote], [`])
252m4@&t@_define([macro_single_quote], ['])
253m4@&t@_define([macro_double_quote], ["])
254m4@&t@_define([macro_backslash], [\\])
255AT_INIT([artificial test suite])
256AT_SETUP([$2])
257AT_CHECK([:])
258AT_CLEANUP
259]], [$4], [], [], [],
260[AT_CHECK([[$CONFIG_SHELL ./micro-suite |
261 sed -n 's/[^:]*: \(.*[^ ]\)[ ]*ok.*/\1/p']],,
262[[$3
263]])
264AT_CHECK([[$CONFIG_SHELL ./micro-suite -l |
265 sed -n 's/.*[0-9]: [^ ][^ ]*[ ][ ]*\(.*[^ ]\)[ ]*/\1/p']],,
266[[$3
267]])
268AT_CHECK([[sed -n 's/[^.]*\. \(.*\) ([^)]*): ok.*/\1/p' micro-suite.log]],,
269[[$3
270]])
271])])
272
273m4_define([AT_CHECK_AT_TITLE_CHAR],
274[AT_CHECK_AT_TITLE([$1 in a test title], [A $2 in my name],
275 [A ]m4_ifval([$3], [[$3]], [[$2]])[ in my name], $4)])
276
277AT_CHECK_AT_TITLE_CHAR([Backquote], [`])
278AT_CHECK_AT_TITLE_CHAR([Single-quote], ['])
279AT_CHECK_AT_TITLE_CHAR([Double-quote], ["])
280AT_CHECK_AT_TITLE_CHAR([Backslash], [\\])
281AT_CHECK_AT_TITLE_CHAR([Brackets], [[[]]], [[]])
282AT_CHECK_AT_TITLE_CHAR([Pound], [[#]], [#])
283AT_CHECK_AT_TITLE_CHAR([Comma], [,])
284
285AT_CHECK_AT_TITLE_CHAR([Quoted Macro], [[macro_name]],
286 [macro_name])
287AT_CHECK_AT_TITLE_CHAR([Macro], [macro_name],
288 [macro_expanded])
289AT_CHECK_AT_TITLE_CHAR([Macro with backquote], [macro_backquote],
290 [`], [:])
291AT_CHECK_AT_TITLE_CHAR([Macro with single-quote], [macro_single_quote], ['])
292AT_CHECK_AT_TITLE_CHAR([Macro with double-quote], [macro_double_quote],
293 ["], [:])
294# This test neither fails nor passes reliably.
295# AT_CHECK_AT_TITLE_CHAR([Macro with backslash], [macro_backslash],
296# [\\], [:])
297
298
299## ----------------- ##
300## Debugging a test. ##
301## ----------------- ##
302
303AT_CHECK_AT_TEST([Debugging a successful test],
304 [AT_CHECK([:])], [], [], [], [ignore],
305[# Without options, when all tests pass, no test directory should exist.
306AT_CHECK([test -d micro-suite.dir/1 && exit 42
307 ./micro-suite -d 1], [], [ignore], [ignore])
308# Running with -d should leave a reproducible test group.
309# Also, running the test script from the test group locks the
310# directory from removal on some platforms; the script should still be
311# able to run even if rmdir fails.
312AT_CHECK([(cd micro-suite.dir/1 && ./run)], [], [ignore], [ignore])
313# Running a debugging script implies -d.
314AT_CHECK([(cd micro-suite.dir/1 && ./run)], [], [ignore], [ignore])
315])
316
317AT_CHECK_AT_TEST([Debugging script and environment],
318 [AT_CHECK([test "$MY_VAR" = pass || exit 42])],
319 [], [1], [], [ignore], [
320# Changing environment outside of debugging script is not preserved.
321AT_CHECK([(cd micro-suite.dir/1 && MY_VAR=pass ./run)],
322 [0], [ignore], [ignore])
323AT_CHECK([(cd micro-suite.dir/1 && ./run)],
324 [1], [ignore], [ignore])
325# Changing environment as argument to debugging script is preserved.
326AT_CHECK([(cd micro-suite.dir/1; ./run MY_VAR=pass)],
327 [0], [ignore], [ignore])
328AT_CHECK([(cd micro-suite.dir/1; ./run)],
329 [0], [ignore], [ignore])
330])
331
332# The run script must still be valid when shell metacharacters are passed
333# in via an environment option.
334AT_CHECK_AT_TEST([Debugging a failed test],
335 [AT_CHECK([test "$MY_VAR" = "one space" || exit 42])],
336 [], [1], [], [ignore], [
337AT_CHECK([(cd micro-suite.dir/1 && ./run MY_VAR='two spaces')],
338 [1], [ignore], [ignore])
339AT_CHECK([(cd micro-suite.dir/1 && ./run MY_VAR='one space')],
340 [0], [ignore], [ignore])
341])
342
343
344## --------- ##
345## Keywords. ##
346## --------- ##
347AT_SETUP([Keywords and ranges])
348AT_KEYWORDS([autotest])
349
350AT_DATA([k.at],
351[[m4_define([AT_PACKAGE_STRING],[k])
352m4_define([AT_PACKAGE_BUGREPORT],[devnull])
353AT_INIT
354AT_SETUP(none)
355AT_CHECK(:)
356AT_CLEANUP
357AT_SETUP(first)
358AT_KEYWORDS(key1)
359AT_CHECK(:)
360AT_CLEANUP
361AT_SETUP(second)
362AT_KEYWORDS(key2)
363AT_CHECK(:)
364AT_CLEANUP
365AT_SETUP(both)
366AT_KEYWORDS(key1)
367AT_KEYWORDS(key2)
368AT_CHECK(:)
369AT_CLEANUP
370]])
371AT_CHECK_AUTOM4TE([--language=autotest -o k k.at])
372
373# AT_CHECK_EGREP(PATTERN, STATUS, COUNT)
374m4_define([AT_CHECK_EGREP],
375[AT_CHECK([$EGREP -c '$1' stdout], $2, [$3
376], ignore)
377])
378
379# AT_CHECK_KEYS(TESTSUITE-OPTIONS, PATTERN1, COUNT1, PATTERN2, COUNT2)
380m4_define([AT_CHECK_KEYS],
381[AT_CHECK([./k $1], 0, [stdout])
382AT_CHECK_EGREP([$2], 0, [$3])
383AT_CHECK_EGREP([$4], 1, [$5])
384])
385
386AT_CHECK_KEYS([-k key1], [first|both], [2], [none|second], [0])
387AT_CHECK_KEYS([-k key2], [second|both], [2], [none|first], [0])
388AT_CHECK_KEYS([-k key1,key2], [both], [1], [none|first|second], [0])
389AT_CHECK_KEYS([-k key1 -k key2], [first|second|both], [3], [none], [0])
390AT_CHECK_KEYS([-k '!key1'], [none|second], [2], [first|both], [0])
391AT_CHECK_KEYS([-k '!key2'], [none|first], [2], [second|both], [0])
392AT_CHECK_KEYS([-k '!key1,key2'], [second], [1], [none|first|both], [0])
393AT_CHECK_KEYS([-k 'key1,!key2'], [first], [1], [none|second|both], [0])
394AT_CHECK_KEYS([-k '!key1,!key2'], [none], [1], [first|second|both], [0])
395AT_CHECK_KEYS([-k '!key1' -k KEY2], [none|second|both], [3], [first], [0])
396AT_CHECK_KEYS([-k key1 -k '!key2'], [none|first|both], [3], [second], [0])
397AT_CHECK_KEYS([-k '!KEY1' -k '!key2'], [none|first|second], [3], [both], [0])
398
399AT_CHECK_KEYS([-k none], [none], [1], [first|second|both], [0])
400AT_CHECK_KEYS([-k key1,both], [both], [1], [none|first|second], [0])
401AT_CHECK_KEYS([-k key1 -k both], [first|both], [2], [none|second], [0])
402AT_CHECK_KEYS([-k none,first], [successful], [1], [none|first|second|both], [0])
403AT_CHECK_KEYS([-k none,first,second,both], [successful], [1], [none|first|second|both], [0])
404AT_CHECK_KEYS([-k !none,first], [first], [1], [none|second|both], [0])
405
406AT_CHECK_KEYS([-k '.*eco.*'], [second], [1], [none|first|both], [0])
407AT_CHECK_KEYS([-k 'ECO'], [successful], [1], [none|first|second|both], [0])
408AT_CHECK_KEYS([-k '.*eco'], [successful], [1], [none|first|second|both], [0])
409AT_CHECK_KEYS([-k 'eco.*'], [successful], [1], [none|first|second|both], [0])
410AT_CHECK_KEYS([-k 'fir.*'], [first], [1], [none|second|both], [0])
411
412AT_CHECK_KEYS([1-2], [none|first], [2], [second|both], [0])
413AT_CHECK_KEYS([1-3 2-1], [none|first|second], [3], [both], [0])
414AT_CHECK_KEYS([-3], [none|first|second], [3], [both], [0])
415AT_CHECK_KEYS([4-], [both], [1], [none|first|second], [0])
416AT_CHECK_KEYS([-k second 4-], [second|both], [2], [none|first], [0])
417AT_CLEANUP
Note: See TracBrowser for help on using the repository browser.