1#! /bin/sh
2# Copyright (C) 2011-2021 Free Software Foundation, Inc.
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2, or (at your option)
7# any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program.  If not, see <https://www.gnu.org/licenses/>.
16
17# TAP support:
18#  - log file creation
19#  - log file removal
20#  - stdout and stderr of a script go in its log file
21#  - TEST_SUITE_LOG redefinition, at either automake or make time
22#  - VERBOSE environment variable support
23# Keep in sync with 'test-log.sh'.
24
25. test-init.sh
26
27cat > Makefile.am << 'END'
28TESTS = pass.test skip.test xfail.test fail.test xpass.test error.test
29TEST_SUITE_LOG = global.log
30END
31
32. tap-setup.sh
33
34# Custom markers, for use in grepping checks.
35cmarker=::: # comment marker
36pmarker=%%% # plain maker
37
38cat > pass.test <<END
39#! /bin/sh -e
40echo 1..1
41echo   "$pmarker pass $pmarker" >&2
42echo "# $cmarker pass $cmarker" >&2
43echo "ok 1"
44END
45
46cat > skip.test <<END
47#! /bin/sh -e
48echo 1..1
49echo   "$pmarker skip $pmarker"
50echo "# $cmarker skip $cmarker"
51echo "ok 1 # SKIP"
52END
53
54cat > xfail.test <<END
55#! /bin/sh -e
56echo 1..1
57echo   "$pmarker xfail $pmarker" >&2
58echo "# $cmarker xfail $cmarker" >&2
59echo "not ok 1 # TODO"
60END
61
62cat > fail.test <<END
63#! /bin/sh -e
64echo 1..1
65echo   "$pmarker fail $pmarker"
66echo "# $cmarker fail $cmarker"
67echo "not ok 1"
68END
69
70cat > xpass.test <<END
71#! /bin/sh -e
72echo 1..1
73echo   "$pmarker xpass $pmarker" >&2
74echo "# $cmarker xpass $cmarker" >&2
75echo "ok 1 # TODO"
76END
77
78cat > error.test <<END
79#! /bin/sh -e
80echo 1..1
81echo   "$pmarker error $pmarker"
82echo "# $cmarker error $cmarker"
83echo 'Bail out!'
84END
85
86chmod a+x *.test
87
88run_make -e FAIL TEST_SUITE_LOG=my.log check
89ls -l # For debugging.
90test ! -e test-suite.log
91test ! -e global.log
92test -f my.log
93st=0
94for result in pass fail xfail xpass skip error; do
95  cat $result.log # For debugging.
96  $FGREP "$pmarker $result $pmarker" $result.log || st=1
97  $FGREP "$cmarker $result $cmarker" $result.log || st=1
98done
99test $st -eq 0 || exit 1
100cat my.log # For debugging.
101for result in xfail fail xpass skip error; do
102  cat $result.log # For debugging.
103  $FGREP "$pmarker $result $pmarker" my.log || st=1
104  $FGREP "$cmarker $result $cmarker" my.log || st=1
105done
106test $($FGREP -c "$pmarker" my.log) -eq 5
107test $($FGREP -c "$cmarker" my.log) -eq 5
108
109# Passed test scripts shouldn't be mentioned in the global log.
110$EGREP '(^pass|[^x]pass)\.test' my.log && exit 1
111# But failing (expectedly or not) and skipped ones should.
112$FGREP 'xfail.test' my.log
113$FGREP 'skip.test' my.log
114$FGREP 'fail.test' my.log
115$FGREP 'xpass.test' my.log
116$FGREP 'error.test' my.log
117
118touch error2.log test-suite.log global.log
119run_make TEST_SUITE_LOG=my.log mostlyclean
120ls -l # For debugging.
121test ! -e my.log
122test ! -e pass.log
123test ! -e fail.log
124test ! -e xfail.log
125test ! -e xpass.log
126test ! -e skip.log
127test ! -e error.log
128# "make mostlyclean" shouldn't remove unrelated log files.
129test -f error2.log
130test -f test-suite.log
131test -f global.log
132
133rm -f *.log
134
135run_make -O -e FAIL check VERBOSE=yes
136cat global.log
137test ! -e my.log
138test ! -e test-suite.log
139# Check that VERBOSE causes the global testsuite log to be
140# emitted on stdout.
141out=$(cat stdout)
142log=$(cat global.log)
143case $out in *"$log"*) ;; *) exit 1;; esac
144
145touch error2.log test-suite.log my.log
146$MAKE clean
147ls -l # For debugging.
148test ! -e global.log
149test ! -e pass.log
150test ! -e fail.log
151test ! -e xfail.log
152test ! -e xpass.log
153test ! -e skip.log
154test ! -e error.log
155# "make clean" shouldn't remove unrelated log files.
156test -f error2.log
157test -f test-suite.log
158test -f my.log
159
160rm -f *.log
161
162:
163