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