blob: b6fa522f292bd39a8014fee3bf93eca991844df0 [file] [log] [blame]
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +00001#!/bin/sh
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00002#
Dmitry V. Levin2e8a7872016-03-30 00:13:37 +00003# Copyright (c) 2011-2016 Dmitry V. Levin <ldv@altlinux.org>
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00004# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# 3. The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +000027
28ME_="${0##*/}"
Dmitry V. Levin2e8a7872016-03-30 00:13:37 +000029LOG="$ME_.tmp"
30OUT="$LOG.out"
31EXP="$LOG.exp"
Dmitry V. Levin579a4aa2016-03-30 00:13:56 +000032NAME="${ME_%.test}"
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +000033
34warn_() { printf >&2 '%s\n' "$*"; }
35fail_() { warn_ "$ME_: failed test: $*"; exit 1; }
36skip_() { warn_ "$ME_: skipped test: $*"; exit 77; }
37framework_failure_() { warn_ "$ME_: framework failure: $*"; exit 99; }
Mike Frysingere689e042011-02-28 19:57:24 -050038framework_skip_() { warn_ "$ME_: framework skip: $*"; exit 77; }
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +000039
40check_prog()
41{
Maxin B. John066a7332013-03-18 11:35:06 +010042 type "$@" > /dev/null 2>&1 ||
Mike Frysingere689e042011-02-28 19:57:24 -050043 framework_skip_ "$* is not available"
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +000044}
45
Dmitry V. Levin8f546642015-03-17 17:07:57 +000046dump_log_and_fail_with()
47{
48 cat < "$LOG"
49 fail_ "$*"
50}
51
52run_prog()
53{
54 if [ $# -eq 0 ]; then
Dmitry V. Levin579a4aa2016-03-30 00:13:56 +000055 set -- "./$NAME"
Dmitry V. Levin8f546642015-03-17 17:07:57 +000056 fi
57 args="$*"
58 "$@" || {
59 if [ $? -eq 77 ]; then
60 skip_ "$args exited with code 77"
61 else
62 fail_ "$args failed"
63 fi
64 }
65}
66
67
68run_prog_skip_if_failed()
69{
70 args="$*"
71 "$@" || framework_skip_ "$args failed"
72}
73
74run_strace()
75{
76 > "$LOG" || fail_ "failed to write $LOG"
77 args="$*"
78 $STRACE -o "$LOG" "$@" ||
79 dump_log_and_fail_with "$STRACE $args failed"
80}
81
82run_strace_merge()
83{
84 rm -f -- "$LOG".[0-9]*
85 run_strace -ff -tt "$@"
86 "$srcdir"/../strace-log-merge "$LOG" > "$LOG" ||
87 dump_log_and_fail_with 'strace-log-merge failed'
88 rm -f -- "$LOG".[0-9]*
89}
90
Dmitry V. Levin79c5c5d2015-04-06 23:40:13 +000091check_gawk()
92{
93 check_prog gawk
94 check_prog grep
95
96 local program="$1"; shift
97 if grep '^@include[[:space:]]' < "$program" > /dev/null; then
98 gawk '@include "/dev/null"' < /dev/null ||
99 framework_skip_ 'gawk does not support @include'
100 fi
101}
102
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000103# Usage: [FILE_TO_CHECK [AWK_PROGRAM [ERROR_MESSAGE [EXTRA_AWK_OPTIONS...]]]]
Dmitry V. Levina69854a2015-09-19 00:01:35 +0000104# Check whether AWK_PROGRAM matches FILE_TO_CHECK using gawk.
105# If it doesn't, dump FILE_TO_CHECK and fail with ERROR_MESSAGE.
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000106match_awk()
107{
Dmitry V. Levin226bf1c2015-03-18 19:14:02 +0000108 local output program error
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000109 if [ $# -eq 0 ]; then
110 output="$LOG"
111 else
112 output="$1"; shift
113 fi
114 if [ $# -eq 0 ]; then
Dmitry V. Levin579a4aa2016-03-30 00:13:56 +0000115 program="$srcdir/$NAME.awk"
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000116 else
117 program="$1"; shift
118 fi
119 if [ $# -eq 0 ]; then
120 error="$STRACE $args output mismatch"
121 else
122 error="$1"; shift
123 fi
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000124
Dmitry V. Levin79c5c5d2015-04-06 23:40:13 +0000125 check_gawk "$program"
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000126
Dmitry V. Levin226bf1c2015-03-18 19:14:02 +0000127 AWKPATH="$srcdir" gawk -f "$program" "$@" < "$output" || {
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000128 cat < "$output"
129 fail_ "$error"
130 }
131}
132
133# Usage: [FILE_TO_CHECK [FILE_TO_COMPATE_WITH [ERROR_MESSAGE]]]
134# Check whether FILE_TO_CHECK differs from FILE_TO_COMPATE_WITH.
135# If it does, dump the difference and fail with ERROR_MESSAGE.
136match_diff()
137{
138 local output expected error
139 if [ $# -eq 0 ]; then
140 output="$LOG"
141 else
142 output="$1"; shift
143 fi
144 if [ $# -eq 0 ]; then
Dmitry V. Levin579a4aa2016-03-30 00:13:56 +0000145 expected="$srcdir/$NAME.expected"
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000146 else
147 expected="$1"; shift
148 fi
149 if [ $# -eq 0 ]; then
150 error="$STRACE $args output mismatch"
151 else
152 error="$1"; shift
153 fi
154
155 check_prog diff
156
157 diff -- "$expected" "$output" ||
158 fail_ "$error"
159}
160
161# Usage: [FILE_TO_CHECK [FILE_WITH_PATTERNS [ERROR_MESSAGE]]]
162# Check whether all patterns listed in FILE_WITH_PATTERNS
163# match FILE_TO_CHECK using egrep.
164# If at least one of these patterns does not match,
165# dump both files and fail with ERROR_MESSAGE.
166match_grep()
167{
Dmitry V. Levin3b731942015-09-19 00:11:07 +0000168 local output patterns error pattern failed=
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000169 if [ $# -eq 0 ]; then
170 output="$LOG"
171 else
172 output="$1"; shift
173 fi
174 if [ $# -eq 0 ]; then
Dmitry V. Levin579a4aa2016-03-30 00:13:56 +0000175 patterns="$srcdir/$NAME.expected"
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000176 else
177 patterns="$1"; shift
178 fi
179 if [ $# -eq 0 ]; then
180 error="$STRACE $args output mismatch"
181 else
182 error="$1"; shift
183 fi
184
185 check_prog wc
186 check_prog grep
187
Dmitry V. Levin3b731942015-09-19 00:11:07 +0000188 while read -r pattern; do
189 LC_ALL=C grep -E -x -e "$pattern" < "$output" > /dev/null || {
190 test -n "$failed" || {
191 echo 'Failed patterns of expected output:'
192 failed=1
193 }
194 printf '%s\n' "$pattern"
195 }
196 done < "$patterns"
197 test -z "$failed" || {
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000198 echo 'Actual output:'
199 cat < "$output"
200 fail_ "$error"
201 }
202}
203
Dmitry V. Levin5dde5672016-03-30 00:16:24 +0000204# Usage: run_strace_match_diff [args to run_strace]
205run_strace_match_diff()
206{
207 args="$*"
208 [ -n "$args" -a -z "${args##*-e trace=*}" ] ||
209 set -- -e trace="$NAME" "$@"
210 run_prog > /dev/null
211 run_strace "$@" $args > "$EXP"
212 match_diff "$LOG" "$EXP"
213 rm -f "$EXP"
214}
215
Dmitry V. Levin3ec5c042014-09-23 01:51:05 +0000216check_prog cat
217check_prog rm
218
Dmitry V. Levin3ec5c042014-09-23 01:51:05 +0000219rm -f "$LOG"
220
Dmitry V. Levinf60347d2013-06-18 15:28:47 +0000221: "${STRACE:=../strace}"
222: "${TIMEOUT_DURATION:=60}"
Dmitry V. Levin1e0a2802013-06-18 20:51:49 +0000223: "${SLEEP_A_BIT:=sleep 1}"
Dmitry V. Levin4f7db9a2015-11-26 21:25:31 +0000224
225[ -z "${VERBOSE-}" ] ||
226 set -x