blob: f01d147a9a6d32ea4c80677d425fcfa48e806212 [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. Levin4e4b5ad2011-02-27 00:28:50 +000032
33warn_() { printf >&2 '%s\n' "$*"; }
34fail_() { warn_ "$ME_: failed test: $*"; exit 1; }
35skip_() { warn_ "$ME_: skipped test: $*"; exit 77; }
36framework_failure_() { warn_ "$ME_: framework failure: $*"; exit 99; }
Mike Frysingere689e042011-02-28 19:57:24 -050037framework_skip_() { warn_ "$ME_: framework skip: $*"; exit 77; }
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +000038
39check_prog()
40{
Maxin B. John066a7332013-03-18 11:35:06 +010041 type "$@" > /dev/null 2>&1 ||
Mike Frysingere689e042011-02-28 19:57:24 -050042 framework_skip_ "$* is not available"
Dmitry V. Levin4e4b5ad2011-02-27 00:28:50 +000043}
44
Dmitry V. Levin8f546642015-03-17 17:07:57 +000045dump_log_and_fail_with()
46{
47 cat < "$LOG"
48 fail_ "$*"
49}
50
51run_prog()
52{
53 if [ $# -eq 0 ]; then
54 set -- "./${ME_%.test}"
55 fi
56 args="$*"
57 "$@" || {
58 if [ $? -eq 77 ]; then
59 skip_ "$args exited with code 77"
60 else
61 fail_ "$args failed"
62 fi
63 }
64}
65
66
67run_prog_skip_if_failed()
68{
69 args="$*"
70 "$@" || framework_skip_ "$args failed"
71}
72
73run_strace()
74{
75 > "$LOG" || fail_ "failed to write $LOG"
76 args="$*"
77 $STRACE -o "$LOG" "$@" ||
78 dump_log_and_fail_with "$STRACE $args failed"
79}
80
81run_strace_merge()
82{
83 rm -f -- "$LOG".[0-9]*
84 run_strace -ff -tt "$@"
85 "$srcdir"/../strace-log-merge "$LOG" > "$LOG" ||
86 dump_log_and_fail_with 'strace-log-merge failed'
87 rm -f -- "$LOG".[0-9]*
88}
89
Dmitry V. Levin79c5c5d2015-04-06 23:40:13 +000090check_gawk()
91{
92 check_prog gawk
93 check_prog grep
94
95 local program="$1"; shift
96 if grep '^@include[[:space:]]' < "$program" > /dev/null; then
97 gawk '@include "/dev/null"' < /dev/null ||
98 framework_skip_ 'gawk does not support @include'
99 fi
100}
101
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000102# Usage: [FILE_TO_CHECK [AWK_PROGRAM [ERROR_MESSAGE [EXTRA_AWK_OPTIONS...]]]]
Dmitry V. Levina69854a2015-09-19 00:01:35 +0000103# Check whether AWK_PROGRAM matches FILE_TO_CHECK using gawk.
104# If it doesn't, dump FILE_TO_CHECK and fail with ERROR_MESSAGE.
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000105match_awk()
106{
Dmitry V. Levin226bf1c2015-03-18 19:14:02 +0000107 local output program error
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000108 if [ $# -eq 0 ]; then
109 output="$LOG"
110 else
111 output="$1"; shift
112 fi
113 if [ $# -eq 0 ]; then
114 program="$srcdir/${ME_%.test}.awk"
115 else
116 program="$1"; shift
117 fi
118 if [ $# -eq 0 ]; then
119 error="$STRACE $args output mismatch"
120 else
121 error="$1"; shift
122 fi
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000123
Dmitry V. Levin79c5c5d2015-04-06 23:40:13 +0000124 check_gawk "$program"
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000125
Dmitry V. Levin226bf1c2015-03-18 19:14:02 +0000126 AWKPATH="$srcdir" gawk -f "$program" "$@" < "$output" || {
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000127 cat < "$output"
128 fail_ "$error"
129 }
130}
131
132# Usage: [FILE_TO_CHECK [FILE_TO_COMPATE_WITH [ERROR_MESSAGE]]]
133# Check whether FILE_TO_CHECK differs from FILE_TO_COMPATE_WITH.
134# If it does, dump the difference and fail with ERROR_MESSAGE.
135match_diff()
136{
137 local output expected error
138 if [ $# -eq 0 ]; then
139 output="$LOG"
140 else
141 output="$1"; shift
142 fi
143 if [ $# -eq 0 ]; then
144 expected="$srcdir/${ME_%.test}.expected"
145 else
146 expected="$1"; shift
147 fi
148 if [ $# -eq 0 ]; then
149 error="$STRACE $args output mismatch"
150 else
151 error="$1"; shift
152 fi
153
154 check_prog diff
155
156 diff -- "$expected" "$output" ||
157 fail_ "$error"
158}
159
160# Usage: [FILE_TO_CHECK [FILE_WITH_PATTERNS [ERROR_MESSAGE]]]
161# Check whether all patterns listed in FILE_WITH_PATTERNS
162# match FILE_TO_CHECK using egrep.
163# If at least one of these patterns does not match,
164# dump both files and fail with ERROR_MESSAGE.
165match_grep()
166{
Dmitry V. Levin3b731942015-09-19 00:11:07 +0000167 local output patterns error pattern failed=
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000168 if [ $# -eq 0 ]; then
169 output="$LOG"
170 else
171 output="$1"; shift
172 fi
173 if [ $# -eq 0 ]; then
174 patterns="$srcdir/${ME_%.test}.expected"
175 else
176 patterns="$1"; shift
177 fi
178 if [ $# -eq 0 ]; then
179 error="$STRACE $args output mismatch"
180 else
181 error="$1"; shift
182 fi
183
184 check_prog wc
185 check_prog grep
186
Dmitry V. Levin3b731942015-09-19 00:11:07 +0000187 while read -r pattern; do
188 LC_ALL=C grep -E -x -e "$pattern" < "$output" > /dev/null || {
189 test -n "$failed" || {
190 echo 'Failed patterns of expected output:'
191 failed=1
192 }
193 printf '%s\n' "$pattern"
194 }
195 done < "$patterns"
196 test -z "$failed" || {
Dmitry V. Levin8f546642015-03-17 17:07:57 +0000197 echo 'Actual output:'
198 cat < "$output"
199 fail_ "$error"
200 }
201}
202
Dmitry V. Levin3ec5c042014-09-23 01:51:05 +0000203check_prog cat
204check_prog rm
205
Dmitry V. Levin3ec5c042014-09-23 01:51:05 +0000206rm -f "$LOG"
207
Dmitry V. Levinf60347d2013-06-18 15:28:47 +0000208: "${STRACE:=../strace}"
209: "${TIMEOUT_DURATION:=60}"
Dmitry V. Levin1e0a2802013-06-18 20:51:49 +0000210: "${SLEEP_A_BIT:=sleep 1}"
Dmitry V. Levin4f7db9a2015-11-26 21:25:31 +0000211
212[ -z "${VERBOSE-}" ] ||
213 set -x