xref: /aosp_15_r20/external/strace/tests-mx32/init.sh (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker#!/bin/sh
2*cf84ac9aSAndroid Build Coastguard Worker#
3*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2011-2016 Dmitry V. Levin <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker# Copyright (c) 2011-2018 The strace developers.
5*cf84ac9aSAndroid Build Coastguard Worker# All rights reserved.
6*cf84ac9aSAndroid Build Coastguard Worker#
7*cf84ac9aSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without
8*cf84ac9aSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions
9*cf84ac9aSAndroid Build Coastguard Worker# are met:
10*cf84ac9aSAndroid Build Coastguard Worker# 1. Redistributions of source code must retain the above copyright
11*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer.
12*cf84ac9aSAndroid Build Coastguard Worker# 2. Redistributions in binary form must reproduce the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker#    notice, this list of conditions and the following disclaimer in the
14*cf84ac9aSAndroid Build Coastguard Worker#    documentation and/or other materials provided with the distribution.
15*cf84ac9aSAndroid Build Coastguard Worker# 3. The name of the author may not be used to endorse or promote products
16*cf84ac9aSAndroid Build Coastguard Worker#    derived from this software without specific prior written permission.
17*cf84ac9aSAndroid Build Coastguard Worker#
18*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*cf84ac9aSAndroid Build Coastguard Worker# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*cf84ac9aSAndroid Build Coastguard Worker# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*cf84ac9aSAndroid Build Coastguard Worker# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*cf84ac9aSAndroid Build Coastguard Worker# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*cf84ac9aSAndroid Build Coastguard Worker# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*cf84ac9aSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*cf84ac9aSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*cf84ac9aSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*cf84ac9aSAndroid Build Coastguard Worker# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*cf84ac9aSAndroid Build Coastguard Worker
29*cf84ac9aSAndroid Build Coastguard Workerexport LC_ALL=C
30*cf84ac9aSAndroid Build Coastguard WorkerME_="${0##*/}"
31*cf84ac9aSAndroid Build Coastguard WorkerLOG="log"
32*cf84ac9aSAndroid Build Coastguard WorkerOUT="out"
33*cf84ac9aSAndroid Build Coastguard WorkerEXP="exp"
34*cf84ac9aSAndroid Build Coastguard Worker
35*cf84ac9aSAndroid Build Coastguard Workerwarn_() { printf >&2 '%s\n' "$*"; }
36*cf84ac9aSAndroid Build Coastguard Workerfail_() { warn_ "$ME_: failed test: $*"; exit 1; }
37*cf84ac9aSAndroid Build Coastguard Workerskip_() { warn_ "$ME_: skipped test: $*"; exit 77; }
38*cf84ac9aSAndroid Build Coastguard Workerframework_failure_() { warn_ "$ME_: framework failure: $*"; exit 99; }
39*cf84ac9aSAndroid Build Coastguard Workerframework_skip_() { warn_ "$ME_: framework skip: $*"; exit 77; }
40*cf84ac9aSAndroid Build Coastguard Worker
41*cf84ac9aSAndroid Build Coastguard Workercheck_prog()
42*cf84ac9aSAndroid Build Coastguard Worker{
43*cf84ac9aSAndroid Build Coastguard Worker	type "$@" > /dev/null 2>&1 ||
44*cf84ac9aSAndroid Build Coastguard Worker		framework_skip_ "$* is not available"
45*cf84ac9aSAndroid Build Coastguard Worker}
46*cf84ac9aSAndroid Build Coastguard Worker
47*cf84ac9aSAndroid Build Coastguard Workerdump_log_and_fail_with()
48*cf84ac9aSAndroid Build Coastguard Worker{
49*cf84ac9aSAndroid Build Coastguard Worker	cat < "$LOG" >&2
50*cf84ac9aSAndroid Build Coastguard Worker	fail_ "$*"
51*cf84ac9aSAndroid Build Coastguard Worker}
52*cf84ac9aSAndroid Build Coastguard Worker
53*cf84ac9aSAndroid Build Coastguard Workerrun_prog()
54*cf84ac9aSAndroid Build Coastguard Worker{
55*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
56*cf84ac9aSAndroid Build Coastguard Worker		set -- "../$NAME"
57*cf84ac9aSAndroid Build Coastguard Worker	fi
58*cf84ac9aSAndroid Build Coastguard Worker	args="$*"
59*cf84ac9aSAndroid Build Coastguard Worker	"$@" || {
60*cf84ac9aSAndroid Build Coastguard Worker		rc=$?
61*cf84ac9aSAndroid Build Coastguard Worker		if [ $rc -eq 77 ]; then
62*cf84ac9aSAndroid Build Coastguard Worker			skip_ "$args exited with code 77"
63*cf84ac9aSAndroid Build Coastguard Worker		else
64*cf84ac9aSAndroid Build Coastguard Worker			fail_ "$args failed with code $rc"
65*cf84ac9aSAndroid Build Coastguard Worker		fi
66*cf84ac9aSAndroid Build Coastguard Worker	}
67*cf84ac9aSAndroid Build Coastguard Worker}
68*cf84ac9aSAndroid Build Coastguard Worker
69*cf84ac9aSAndroid Build Coastguard Worker
70*cf84ac9aSAndroid Build Coastguard Workerrun_prog_skip_if_failed()
71*cf84ac9aSAndroid Build Coastguard Worker{
72*cf84ac9aSAndroid Build Coastguard Worker	args="$*"
73*cf84ac9aSAndroid Build Coastguard Worker	"$@" || framework_skip_ "$args failed with code $?"
74*cf84ac9aSAndroid Build Coastguard Worker}
75*cf84ac9aSAndroid Build Coastguard Worker
76*cf84ac9aSAndroid Build Coastguard Workertry_run_prog()
77*cf84ac9aSAndroid Build Coastguard Worker{
78*cf84ac9aSAndroid Build Coastguard Worker	local rc
79*cf84ac9aSAndroid Build Coastguard Worker
80*cf84ac9aSAndroid Build Coastguard Worker	"$@" > /dev/null || {
81*cf84ac9aSAndroid Build Coastguard Worker		rc=$?
82*cf84ac9aSAndroid Build Coastguard Worker		if [ $rc -eq 77 ]; then
83*cf84ac9aSAndroid Build Coastguard Worker			return 1
84*cf84ac9aSAndroid Build Coastguard Worker		else
85*cf84ac9aSAndroid Build Coastguard Worker			fail_ "$* failed with code $rc"
86*cf84ac9aSAndroid Build Coastguard Worker		fi
87*cf84ac9aSAndroid Build Coastguard Worker	}
88*cf84ac9aSAndroid Build Coastguard Worker}
89*cf84ac9aSAndroid Build Coastguard Worker
90*cf84ac9aSAndroid Build Coastguard Workerrun_strace()
91*cf84ac9aSAndroid Build Coastguard Worker{
92*cf84ac9aSAndroid Build Coastguard Worker	> "$LOG" || fail_ "failed to write $LOG"
93*cf84ac9aSAndroid Build Coastguard Worker	args="$*"
94*cf84ac9aSAndroid Build Coastguard Worker	$STRACE -o "$LOG" "$@" ||
95*cf84ac9aSAndroid Build Coastguard Worker		dump_log_and_fail_with "$STRACE $args failed with code $?"
96*cf84ac9aSAndroid Build Coastguard Worker}
97*cf84ac9aSAndroid Build Coastguard Worker
98*cf84ac9aSAndroid Build Coastguard Workerrun_strace_merge()
99*cf84ac9aSAndroid Build Coastguard Worker{
100*cf84ac9aSAndroid Build Coastguard Worker	rm -f -- "$LOG".[0-9]*
101*cf84ac9aSAndroid Build Coastguard Worker	run_strace -ff -tt "$@"
102*cf84ac9aSAndroid Build Coastguard Worker	"$srcdir"/../strace-log-merge "$LOG" > "$LOG" ||
103*cf84ac9aSAndroid Build Coastguard Worker		dump_log_and_fail_with 'strace-log-merge failed with code $?'
104*cf84ac9aSAndroid Build Coastguard Worker	rm -f -- "$LOG".[0-9]*
105*cf84ac9aSAndroid Build Coastguard Worker}
106*cf84ac9aSAndroid Build Coastguard Worker
107*cf84ac9aSAndroid Build Coastguard Workercheck_gawk()
108*cf84ac9aSAndroid Build Coastguard Worker{
109*cf84ac9aSAndroid Build Coastguard Worker	check_prog gawk
110*cf84ac9aSAndroid Build Coastguard Worker	check_prog grep
111*cf84ac9aSAndroid Build Coastguard Worker
112*cf84ac9aSAndroid Build Coastguard Worker	local program="$1"; shift
113*cf84ac9aSAndroid Build Coastguard Worker	if grep '^@include[[:space:]]' < "$program" > /dev/null; then
114*cf84ac9aSAndroid Build Coastguard Worker		gawk '@include "/dev/null"' < /dev/null ||
115*cf84ac9aSAndroid Build Coastguard Worker			framework_skip_ 'gawk does not support @include'
116*cf84ac9aSAndroid Build Coastguard Worker	fi
117*cf84ac9aSAndroid Build Coastguard Worker}
118*cf84ac9aSAndroid Build Coastguard Worker
119*cf84ac9aSAndroid Build Coastguard Worker# Usage: [FILE_TO_CHECK [AWK_PROGRAM [ERROR_MESSAGE [EXTRA_AWK_OPTIONS...]]]]
120*cf84ac9aSAndroid Build Coastguard Worker# Check whether AWK_PROGRAM matches FILE_TO_CHECK using gawk.
121*cf84ac9aSAndroid Build Coastguard Worker# If it doesn't, dump FILE_TO_CHECK and fail with ERROR_MESSAGE.
122*cf84ac9aSAndroid Build Coastguard Workermatch_awk()
123*cf84ac9aSAndroid Build Coastguard Worker{
124*cf84ac9aSAndroid Build Coastguard Worker	local output program error
125*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
126*cf84ac9aSAndroid Build Coastguard Worker		output="$LOG"
127*cf84ac9aSAndroid Build Coastguard Worker	else
128*cf84ac9aSAndroid Build Coastguard Worker		output="$1"; shift
129*cf84ac9aSAndroid Build Coastguard Worker	fi
130*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
131*cf84ac9aSAndroid Build Coastguard Worker		program="$srcdir/$NAME.awk"
132*cf84ac9aSAndroid Build Coastguard Worker	else
133*cf84ac9aSAndroid Build Coastguard Worker		program="$1"; shift
134*cf84ac9aSAndroid Build Coastguard Worker	fi
135*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
136*cf84ac9aSAndroid Build Coastguard Worker		error="$STRACE $args output mismatch"
137*cf84ac9aSAndroid Build Coastguard Worker	else
138*cf84ac9aSAndroid Build Coastguard Worker		error="$1"; shift
139*cf84ac9aSAndroid Build Coastguard Worker	fi
140*cf84ac9aSAndroid Build Coastguard Worker
141*cf84ac9aSAndroid Build Coastguard Worker	check_gawk "$program"
142*cf84ac9aSAndroid Build Coastguard Worker
143*cf84ac9aSAndroid Build Coastguard Worker	AWKPATH="$srcdir" gawk -f "$program" "$@" < "$output" || {
144*cf84ac9aSAndroid Build Coastguard Worker		cat < "$output"
145*cf84ac9aSAndroid Build Coastguard Worker		fail_ "$error"
146*cf84ac9aSAndroid Build Coastguard Worker	}
147*cf84ac9aSAndroid Build Coastguard Worker}
148*cf84ac9aSAndroid Build Coastguard Worker
149*cf84ac9aSAndroid Build Coastguard Worker# Usage: [FILE_TO_CHECK [FILE_TO_COMPATE_WITH [ERROR_MESSAGE]]]
150*cf84ac9aSAndroid Build Coastguard Worker# Check whether FILE_TO_CHECK differs from FILE_TO_COMPATE_WITH.
151*cf84ac9aSAndroid Build Coastguard Worker# If it does, dump the difference and fail with ERROR_MESSAGE.
152*cf84ac9aSAndroid Build Coastguard Workermatch_diff()
153*cf84ac9aSAndroid Build Coastguard Worker{
154*cf84ac9aSAndroid Build Coastguard Worker	local output expected error
155*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
156*cf84ac9aSAndroid Build Coastguard Worker		output="$LOG"
157*cf84ac9aSAndroid Build Coastguard Worker	else
158*cf84ac9aSAndroid Build Coastguard Worker		output="$1"; shift
159*cf84ac9aSAndroid Build Coastguard Worker	fi
160*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
161*cf84ac9aSAndroid Build Coastguard Worker		expected="$srcdir/$NAME.expected"
162*cf84ac9aSAndroid Build Coastguard Worker	else
163*cf84ac9aSAndroid Build Coastguard Worker		expected="$1"; shift
164*cf84ac9aSAndroid Build Coastguard Worker	fi
165*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
166*cf84ac9aSAndroid Build Coastguard Worker		error="$STRACE $args output mismatch"
167*cf84ac9aSAndroid Build Coastguard Worker	else
168*cf84ac9aSAndroid Build Coastguard Worker		error="$1"; shift
169*cf84ac9aSAndroid Build Coastguard Worker	fi
170*cf84ac9aSAndroid Build Coastguard Worker
171*cf84ac9aSAndroid Build Coastguard Worker	check_prog diff
172*cf84ac9aSAndroid Build Coastguard Worker
173*cf84ac9aSAndroid Build Coastguard Worker	diff -u -- "$expected" "$output" ||
174*cf84ac9aSAndroid Build Coastguard Worker		fail_ "$error"
175*cf84ac9aSAndroid Build Coastguard Worker}
176*cf84ac9aSAndroid Build Coastguard Worker
177*cf84ac9aSAndroid Build Coastguard Worker# Usage: [FILE_TO_CHECK [FILE_WITH_PATTERNS [ERROR_MESSAGE]]]
178*cf84ac9aSAndroid Build Coastguard Worker# Check whether all patterns listed in FILE_WITH_PATTERNS
179*cf84ac9aSAndroid Build Coastguard Worker# match FILE_TO_CHECK using egrep.
180*cf84ac9aSAndroid Build Coastguard Worker# If at least one of these patterns does not match,
181*cf84ac9aSAndroid Build Coastguard Worker# dump both files and fail with ERROR_MESSAGE.
182*cf84ac9aSAndroid Build Coastguard Workermatch_grep()
183*cf84ac9aSAndroid Build Coastguard Worker{
184*cf84ac9aSAndroid Build Coastguard Worker	local output patterns error pattern cnt failed=
185*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
186*cf84ac9aSAndroid Build Coastguard Worker		output="$LOG"
187*cf84ac9aSAndroid Build Coastguard Worker	else
188*cf84ac9aSAndroid Build Coastguard Worker		output="$1"; shift
189*cf84ac9aSAndroid Build Coastguard Worker	fi
190*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
191*cf84ac9aSAndroid Build Coastguard Worker		patterns="$srcdir/$NAME.expected"
192*cf84ac9aSAndroid Build Coastguard Worker	else
193*cf84ac9aSAndroid Build Coastguard Worker		patterns="$1"; shift
194*cf84ac9aSAndroid Build Coastguard Worker	fi
195*cf84ac9aSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
196*cf84ac9aSAndroid Build Coastguard Worker		error="$STRACE $args output mismatch"
197*cf84ac9aSAndroid Build Coastguard Worker	else
198*cf84ac9aSAndroid Build Coastguard Worker		error="$1"; shift
199*cf84ac9aSAndroid Build Coastguard Worker	fi
200*cf84ac9aSAndroid Build Coastguard Worker
201*cf84ac9aSAndroid Build Coastguard Worker	check_prog wc
202*cf84ac9aSAndroid Build Coastguard Worker	check_prog grep
203*cf84ac9aSAndroid Build Coastguard Worker
204*cf84ac9aSAndroid Build Coastguard Worker	cnt=1
205*cf84ac9aSAndroid Build Coastguard Worker	while read -r pattern; do
206*cf84ac9aSAndroid Build Coastguard Worker		LC_ALL=C grep -E -x -e "$pattern" < "$output" > /dev/null || {
207*cf84ac9aSAndroid Build Coastguard Worker			test -n "$failed" || {
208*cf84ac9aSAndroid Build Coastguard Worker				echo 'Failed patterns of expected output:'
209*cf84ac9aSAndroid Build Coastguard Worker				failed=1
210*cf84ac9aSAndroid Build Coastguard Worker			}
211*cf84ac9aSAndroid Build Coastguard Worker			printf '#%d: %s\n' "$cnt" "$pattern"
212*cf84ac9aSAndroid Build Coastguard Worker		}
213*cf84ac9aSAndroid Build Coastguard Worker		cnt=$(($cnt + 1))
214*cf84ac9aSAndroid Build Coastguard Worker	done < "$patterns"
215*cf84ac9aSAndroid Build Coastguard Worker	test -z "$failed" || {
216*cf84ac9aSAndroid Build Coastguard Worker		echo 'Actual output:'
217*cf84ac9aSAndroid Build Coastguard Worker		cat < "$output"
218*cf84ac9aSAndroid Build Coastguard Worker		fail_ "$error"
219*cf84ac9aSAndroid Build Coastguard Worker	}
220*cf84ac9aSAndroid Build Coastguard Worker}
221*cf84ac9aSAndroid Build Coastguard Worker
222*cf84ac9aSAndroid Build Coastguard Worker# Usage: run_strace_match_diff [args to run_strace]
223*cf84ac9aSAndroid Build Coastguard Workerrun_strace_match_diff()
224*cf84ac9aSAndroid Build Coastguard Worker{
225*cf84ac9aSAndroid Build Coastguard Worker	args="$*"
226*cf84ac9aSAndroid Build Coastguard Worker	[ -n "$args" -a -z "${args##*-e trace=*}" ] ||
227*cf84ac9aSAndroid Build Coastguard Worker		set -- -e trace="$NAME" "$@"
228*cf84ac9aSAndroid Build Coastguard Worker	run_prog > /dev/null
229*cf84ac9aSAndroid Build Coastguard Worker	run_strace "$@" $args > "$EXP"
230*cf84ac9aSAndroid Build Coastguard Worker	match_diff "$LOG" "$EXP"
231*cf84ac9aSAndroid Build Coastguard Worker}
232*cf84ac9aSAndroid Build Coastguard Worker
233*cf84ac9aSAndroid Build Coastguard Worker# Usage: run_strace_match_grep [args to run_strace]
234*cf84ac9aSAndroid Build Coastguard Workerrun_strace_match_grep()
235*cf84ac9aSAndroid Build Coastguard Worker{
236*cf84ac9aSAndroid Build Coastguard Worker	args="$*"
237*cf84ac9aSAndroid Build Coastguard Worker	[ -n "$args" -a -z "${args##*-e trace=*}" ] ||
238*cf84ac9aSAndroid Build Coastguard Worker		set -- -e trace="$NAME" "$@"
239*cf84ac9aSAndroid Build Coastguard Worker	run_prog > /dev/null
240*cf84ac9aSAndroid Build Coastguard Worker	run_strace "$@" $args > "$EXP"
241*cf84ac9aSAndroid Build Coastguard Worker	match_grep "$LOG" "$EXP"
242*cf84ac9aSAndroid Build Coastguard Worker}
243*cf84ac9aSAndroid Build Coastguard Worker
244*cf84ac9aSAndroid Build Coastguard Worker# Print kernel version code.
245*cf84ac9aSAndroid Build Coastguard Worker# usage: kernel_version_code $(uname -r)
246*cf84ac9aSAndroid Build Coastguard Workerkernel_version_code()
247*cf84ac9aSAndroid Build Coastguard Worker{
248*cf84ac9aSAndroid Build Coastguard Worker	(
249*cf84ac9aSAndroid Build Coastguard Worker		set -f
250*cf84ac9aSAndroid Build Coastguard Worker		IFS=.
251*cf84ac9aSAndroid Build Coastguard Worker		set -- $1 0 0
252*cf84ac9aSAndroid Build Coastguard Worker		v1="${1%%[!0-9]*}" && [ -n "$v1" ] || v1=0
253*cf84ac9aSAndroid Build Coastguard Worker		v2="${2%%[!0-9]*}" && [ -n "$v2" ] || v2=0
254*cf84ac9aSAndroid Build Coastguard Worker		v3="${3%%[!0-9]*}" && [ -n "$v3" ] || v3=0
255*cf84ac9aSAndroid Build Coastguard Worker		echo "$(($v1 * 65536 + $v2 * 256 + $v3))"
256*cf84ac9aSAndroid Build Coastguard Worker	)
257*cf84ac9aSAndroid Build Coastguard Worker}
258*cf84ac9aSAndroid Build Coastguard Worker
259*cf84ac9aSAndroid Build Coastguard Worker# Usage: require_min_kernel_version_or_skip 3.0
260*cf84ac9aSAndroid Build Coastguard Workerrequire_min_kernel_version_or_skip()
261*cf84ac9aSAndroid Build Coastguard Worker{
262*cf84ac9aSAndroid Build Coastguard Worker	local uname_r
263*cf84ac9aSAndroid Build Coastguard Worker	uname_r="$(uname -r)"
264*cf84ac9aSAndroid Build Coastguard Worker
265*cf84ac9aSAndroid Build Coastguard Worker	[ "$(kernel_version_code "$uname_r")" -ge \
266*cf84ac9aSAndroid Build Coastguard Worker	  "$(kernel_version_code "$1")" ] ||
267*cf84ac9aSAndroid Build Coastguard Worker		skip_ "the kernel release $uname_r is not $1 or newer"
268*cf84ac9aSAndroid Build Coastguard Worker}
269*cf84ac9aSAndroid Build Coastguard Worker
270*cf84ac9aSAndroid Build Coastguard Worker# Usage: grep_pid_status $pid GREP-OPTIONS...
271*cf84ac9aSAndroid Build Coastguard Workergrep_pid_status()
272*cf84ac9aSAndroid Build Coastguard Worker{
273*cf84ac9aSAndroid Build Coastguard Worker	local pid
274*cf84ac9aSAndroid Build Coastguard Worker	pid=$1; shift
275*cf84ac9aSAndroid Build Coastguard Worker	cat < "/proc/$pid/status" | grep "$@"
276*cf84ac9aSAndroid Build Coastguard Worker}
277*cf84ac9aSAndroid Build Coastguard Worker
278*cf84ac9aSAndroid Build Coastguard Worker# Subtracts one program set from another.
279*cf84ac9aSAndroid Build Coastguard Worker# If an optional regular expression is specified, the lines in the minuend file
280*cf84ac9aSAndroid Build Coastguard Worker# that match this regular expression are elso excluded from the output.
281*cf84ac9aSAndroid Build Coastguard Worker#
282*cf84ac9aSAndroid Build Coastguard Worker# Usage: prog_set_subtract minuend_file subtrahend_file [subtrahend_regexp]
283*cf84ac9aSAndroid Build Coastguard Workerprog_set_subtract()
284*cf84ac9aSAndroid Build Coastguard Worker{
285*cf84ac9aSAndroid Build Coastguard Worker	local min sub re pat
286*cf84ac9aSAndroid Build Coastguard Worker	min="$1"; shift
287*cf84ac9aSAndroid Build Coastguard Worker	sub="$1"; shift
288*cf84ac9aSAndroid Build Coastguard Worker	re="${1-}"
289*cf84ac9aSAndroid Build Coastguard Worker	pat="$re|$(sed 's/[[:space:]].*//' < "$sub" | tr -s '\n' '|')"
290*cf84ac9aSAndroid Build Coastguard Worker	grep -E -v -x -e "$pat" < "$min"
291*cf84ac9aSAndroid Build Coastguard Worker}
292*cf84ac9aSAndroid Build Coastguard Worker
293*cf84ac9aSAndroid Build Coastguard Worker# Usage: test_pure_prog_set [--expfile FILE] COMMON_ARGS < tests_file
294*cf84ac9aSAndroid Build Coastguard Worker# stdin should consist of lines in "test_name strace_args..." format.
295*cf84ac9aSAndroid Build Coastguard Workertest_pure_prog_set()
296*cf84ac9aSAndroid Build Coastguard Worker{
297*cf84ac9aSAndroid Build Coastguard Worker	local expfile
298*cf84ac9aSAndroid Build Coastguard Worker
299*cf84ac9aSAndroid Build Coastguard Worker	expfile="$EXP"
300*cf84ac9aSAndroid Build Coastguard Worker
301*cf84ac9aSAndroid Build Coastguard Worker	while [ -n "$1" ]; do
302*cf84ac9aSAndroid Build Coastguard Worker		case "$1" in
303*cf84ac9aSAndroid Build Coastguard Worker		--expfile)
304*cf84ac9aSAndroid Build Coastguard Worker			shift
305*cf84ac9aSAndroid Build Coastguard Worker			expfile="$1"
306*cf84ac9aSAndroid Build Coastguard Worker			shift
307*cf84ac9aSAndroid Build Coastguard Worker			;;
308*cf84ac9aSAndroid Build Coastguard Worker		*)
309*cf84ac9aSAndroid Build Coastguard Worker			break
310*cf84ac9aSAndroid Build Coastguard Worker			;;
311*cf84ac9aSAndroid Build Coastguard Worker		esac
312*cf84ac9aSAndroid Build Coastguard Worker	done
313*cf84ac9aSAndroid Build Coastguard Worker
314*cf84ac9aSAndroid Build Coastguard Worker	while read -r t prog_args; do {
315*cf84ac9aSAndroid Build Coastguard Worker		# skip lines beginning with "#" symbol
316*cf84ac9aSAndroid Build Coastguard Worker		[ "${t###}" = "$t" ] || continue
317*cf84ac9aSAndroid Build Coastguard Worker
318*cf84ac9aSAndroid Build Coastguard Worker		try_run_prog "../$t" || continue
319*cf84ac9aSAndroid Build Coastguard Worker		run_strace $prog_args "$@" "../$t" > "$expfile"
320*cf84ac9aSAndroid Build Coastguard Worker		match_diff "$LOG" "$expfile"
321*cf84ac9aSAndroid Build Coastguard Worker	} < /dev/null; done
322*cf84ac9aSAndroid Build Coastguard Worker}
323*cf84ac9aSAndroid Build Coastguard Worker
324*cf84ac9aSAndroid Build Coastguard Worker# Run strace against list of programs put in "$NAME.in" and then against the
325*cf84ac9aSAndroid Build Coastguard Worker# rest of pure_executables.list with the expectation of empty output in the
326*cf84ac9aSAndroid Build Coastguard Worker# latter case.
327*cf84ac9aSAndroid Build Coastguard Worker#
328*cf84ac9aSAndroid Build Coastguard Worker# Usage: source this file after init.sh and call:
329*cf84ac9aSAndroid Build Coastguard Worker#   test_trace_expr subtrahend_regexp strace_args
330*cf84ac9aSAndroid Build Coastguard Worker# Environment:
331*cf84ac9aSAndroid Build Coastguard Worker#   $NAME:	test name, used for "$NAME.in" file containing list of tests
332*cf84ac9aSAndroid Build Coastguard Worker#		for positive trace expression match;
333*cf84ac9aSAndroid Build Coastguard Worker#   $srcdir:	used to find pure_executables.list and "$NAME.in" files.
334*cf84ac9aSAndroid Build Coastguard Worker# Files created:
335*cf84ac9aSAndroid Build Coastguard Worker#   negative.list: File containing list of tests for negative match.
336*cf84ac9aSAndroid Build Coastguard Workertest_trace_expr()
337*cf84ac9aSAndroid Build Coastguard Worker{
338*cf84ac9aSAndroid Build Coastguard Worker	local subtrahend_regexp
339*cf84ac9aSAndroid Build Coastguard Worker	subtrahend_regexp="$1"; shift
340*cf84ac9aSAndroid Build Coastguard Worker	test_pure_prog_set "$@" < "$srcdir/$NAME.in"
341*cf84ac9aSAndroid Build Coastguard Worker	prog_set_subtract "$srcdir/pure_executables.list" "$srcdir/$NAME.in" \
342*cf84ac9aSAndroid Build Coastguard Worker		"$subtrahend_regexp" > negative.list
343*cf84ac9aSAndroid Build Coastguard Worker	test_pure_prog_set --expfile /dev/null -qq -esignal=none "$@" \
344*cf84ac9aSAndroid Build Coastguard Worker		< negative.list
345*cf84ac9aSAndroid Build Coastguard Worker}
346*cf84ac9aSAndroid Build Coastguard Worker
347*cf84ac9aSAndroid Build Coastguard Workercheck_prog cat
348*cf84ac9aSAndroid Build Coastguard Workercheck_prog rm
349*cf84ac9aSAndroid Build Coastguard Worker
350*cf84ac9aSAndroid Build Coastguard Workercase "$ME_" in
351*cf84ac9aSAndroid Build Coastguard Worker	*.gen.test) NAME="${ME_%.gen.test}" ;;
352*cf84ac9aSAndroid Build Coastguard Worker	*.test) NAME="${ME_%.test}" ;;
353*cf84ac9aSAndroid Build Coastguard Worker	*) NAME=
354*cf84ac9aSAndroid Build Coastguard Workeresac
355*cf84ac9aSAndroid Build Coastguard Worker
356*cf84ac9aSAndroid Build Coastguard WorkerSTRACE_EXE=
357*cf84ac9aSAndroid Build Coastguard Workerif [ -n "$NAME" ]; then
358*cf84ac9aSAndroid Build Coastguard Worker	TESTDIR="$NAME.dir"
359*cf84ac9aSAndroid Build Coastguard Worker	rm -rf -- "$TESTDIR"
360*cf84ac9aSAndroid Build Coastguard Worker	mkdir -- "$TESTDIR"
361*cf84ac9aSAndroid Build Coastguard Worker	cd "$TESTDIR"
362*cf84ac9aSAndroid Build Coastguard Worker
363*cf84ac9aSAndroid Build Coastguard Worker	case "$srcdir" in
364*cf84ac9aSAndroid Build Coastguard Worker		/*) ;;
365*cf84ac9aSAndroid Build Coastguard Worker		*) srcdir="../$srcdir" ;;
366*cf84ac9aSAndroid Build Coastguard Worker	esac
367*cf84ac9aSAndroid Build Coastguard Worker
368*cf84ac9aSAndroid Build Coastguard Worker	[ -n "${STRACE-}" ] || {
369*cf84ac9aSAndroid Build Coastguard Worker		STRACE=../../strace
370*cf84ac9aSAndroid Build Coastguard Worker		case "${LOG_COMPILER-} ${LOG_FLAGS-}" in
371*cf84ac9aSAndroid Build Coastguard Worker			*--suppressions=*--error-exitcode=*--tool=*)
372*cf84ac9aSAndroid Build Coastguard Worker			STRACE_EXE="$STRACE"
373*cf84ac9aSAndroid Build Coastguard Worker			# add valgrind command prefix
374*cf84ac9aSAndroid Build Coastguard Worker			STRACE="${LOG_COMPILER-} ${LOG_FLAGS-} $STRACE"
375*cf84ac9aSAndroid Build Coastguard Worker			;;
376*cf84ac9aSAndroid Build Coastguard Worker		esac
377*cf84ac9aSAndroid Build Coastguard Worker	}
378*cf84ac9aSAndroid Build Coastguard Worker
379*cf84ac9aSAndroid Build Coastguard Worker	trap 'dump_log_and_fail_with "time limit ($TIMEOUT_DURATION) exceeded"' XCPU
380*cf84ac9aSAndroid Build Coastguard Workerelse
381*cf84ac9aSAndroid Build Coastguard Worker	: "${STRACE:=../strace}"
382*cf84ac9aSAndroid Build Coastguard Workerfi
383*cf84ac9aSAndroid Build Coastguard Worker
384*cf84ac9aSAndroid Build Coastguard Worker# Export $STRACE_EXE to check_PROGRAMS.
385*cf84ac9aSAndroid Build Coastguard Worker: "${STRACE_EXE:=$STRACE}"
386*cf84ac9aSAndroid Build Coastguard Workerexport STRACE_EXE
387*cf84ac9aSAndroid Build Coastguard Worker
388*cf84ac9aSAndroid Build Coastguard Worker: "${TIMEOUT_DURATION:=600}"
389*cf84ac9aSAndroid Build Coastguard Worker: "${SLEEP_A_BIT:=sleep 1}"
390*cf84ac9aSAndroid Build Coastguard Worker
391*cf84ac9aSAndroid Build Coastguard Worker[ -z "${VERBOSE-}" ] ||
392*cf84ac9aSAndroid Build Coastguard Worker	set -x
393